首页 > 代码库 > 2016.9.15 --- 2014 北京

2016.9.15 --- 2014 北京

1001 A Curious Matt

求最大的平均速度

技术分享
 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6  7 typedef long long LL; 8 const int maxn = 1e5+5; 9 int n,m;10 11 struct node{12     int x,t;13 }a[maxn];14 15 int cmp(node n1,node n2){16     return n1.t < n2.t;17 }18 19 void solve(){20     double ans = 0;21     sort(a+1,a+n+1,cmp);22     for(int i = 2;i <= n;i++){23         int fz = abs(a[i].x-a[i-1].x);24         int fm = a[i].t - a[i-1].t;25         double res = (1.0*fz)/(1.0*fm);26         ans = max(ans,res);27     }28     printf("%.2lf\n",ans);29 }30 31 int main(){32     int T;33     int kase = 0;34     scanf("%d",&T);35     while(T--){36         scanf("%d",&n);37         for(int i = 1;i <= n;i++){38             scanf("%d %d",&a[i].t,&a[i].x);39         }40         printf("Case #%d: ",++kase);41         solve();42     }43     return 0;44 }
View Code

 

 

1002 Black And White

n*m 的格子,一共 k 种颜色

c1 + c2 + c3 +...+ck = n*m 求相邻格子的颜色不同的染色方案

题解说的本应该是构造,姿势好的爆搜也可以过

剪枝 是 当一种颜色超过剩余格子的一半的时候,就不行了

技术分享
 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6  7 int ans[15][15],c[105],n,m,k; 8 int flag; 9 int cnt[105];10 11 void print(){12     puts("YES");13     for(int i = 1;i <= n;i++){14         for(int j = 1;j < m;j++) printf("%d ",ans[i][j]);15         printf("%d\n",ans[i][m]);16     }17 }18 19 bool dfs(int x,int y){20     for(int i = 1;i <= k;i++){21         if((n*m - (x-1)*m-y+2)/2 < c[i]) return false;22     }23     for(int i = 1;i <= k;i++){24         if(c[i]){25             if(ans[x][y-1] == i || ans[x-1][y] == i) continue;26             ans[x][y] = i;27             //printf("ans[%d][%d] = %d\n",x,y,ans[x][y]);28             c[i]--;29             if(x == n && y == m){print();return true;}30             if(y != m && dfs(x,y+1)) return true;31             if(y == m && dfs(x+1,1)) return true;32             c[i]++;33         }34     }35     return false;36 }37 38 int cmp(int x,int y){39     return x > y;40 }41 42 void solve(){43     flag = 0;44     for(int i = 1;i <= k;i++){45         if(c[i] > (n*m+1)/2){46             puts("NO");47             return;48         }49     }50     memset(ans,0,sizeof(ans));51     if(k == 1 && n*m != 1){52         puts("NO");53         return;54     }55     if(dfs(1,1)) return;56     puts("NO");57 }58 59 int main(){60     int T,kase = 0;61     scanf("%d",&T);62     while(T--){63         scanf("%d %d %d",&n,&m,&k);64         for(int i = 1;i <= k;i++) {65             scanf("%d",&c[i]);66         }67         printf("Case #%d:\n",++kase);68         solve();69     }70     return 0;71 }
View Code

 

 

1003 Collision

给出一个矩形.两个开始的点,运动速度都相同,运动方向是 (1,1)碰到矩形的边的时候,会发生弹性碰撞

求第一次碰撞的坐标..

第三个样例画不出来怎么撞的啊...第二个点不是运动出去了么...wwww

不懂

 

1004 Dire Wolf

有 n 只狼排成一排,每只狼有一个初始的伤害值ai ,同时每只狼还有附加的伤害值 bi ,每只狼可以给它相邻的狼增加伤害值,杀死一只狼需要的伤害值 是 ai + bi-1,bi+1

可以任意选择杀狼的顺序,问杀死这 n 只狼需要的最小的伤害值

比赛的时候,还是没太搞清楚伤害值该怎么去算,dp 顺序有问题,而且转移也有问题

dp[i][j] 表示 杀死从i 到 j 的狼所需要的最小伤害值

枚举这段区间最后杀死的狼 是 k ,那么杀死这只狼的代价,就是 a[k] + b[i-1] + b[j+1] (因为它是最后一只狼,左右两端是 i-1,j+1)

技术分享
 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6  7 typedef long long LL; 8 const int maxn = 205; 9 int a[maxn],b[maxn],dp[maxn][maxn];10 const int INF = (1<<30)-1;11 int n;12 13 void solve(){14     dp[0][0] = 0;15     b[0] = b[n+1] = 0;16     for(int i = 1;i <= n;i++){17         for(int j = 1;j <= n;j++){18             if(i == j) dp[i][i] = a[i]+b[i-1]+b[i+1];19             else dp[i][j] = INF;20         }21     }22 23     for(int l = 2;l <= n;l++){24         for(int s = 1;s+l-1 <= n;s++){25             int e = s+l-1;26             for(int k = s;k <= e;k++){27                 if(k == s) dp[s][e] = min(dp[s][e],dp[s+1][e]+a[s]+b[s-1]+b[e+1]);28                 else if(k == e) dp[s][e] = min(dp[s][e],dp[s][e-1]+a[e]+b[e+1]+b[s-1]);29                 else{30                     dp[s][e] = min(dp[s][e],dp[s][k-1]+dp[k+1][e]+a[k]+b[s-1]+b[e+1]);31                 }32             }33         }34     }35     printf("%d\n",dp[1][n]);36 }37 38 int main(){39     int T,kase = 0;40     scanf("%d",&T);41     while(T--){42         scanf("%d",&n);43         for(int i = 1;i <= n;i++) scanf("%d",&a[i]);44         for(int i = 1;i <= n;i++) scanf("%d",&b[i]);45         printf("Case #%d: ",++kase);46         solve();47     }48     return 0;49 }
View Code

 

 

1005 Everlasting L

给出 一个点集,称这样的点集是 good 的

(x,y),(x+1,y),....(x+a,y),(x,y+1),(x,y+2),.... (x,y+b) gcd(a,b) = 1

问点集中满足,A ,B都是 good 且 A交B为空 的有多少对

不会捉..搜一个题解说是dp

 

1006 Fluorescent

一共 m 个开关,每个开关控制一些灯

最后灯亮的个数为 X ,求 X^3的期望

设最后灯亮的情况为 x1 + x2 + x3 +... +xn

所以 x^3 可以写成 (x1+x2+x3+...+xn)*(x1+x2+...+xn)*(x1+x2+...+xn)

x^3 就是 sum(xi*xj*xk) (1 <= i ,j , k <= n)只有当 xi ,xj ,xk 都为 1 的时候才对答案有贡献

 

 

 

 

1007 GRE Words Once More!

 

1008 Happy Matt Friends

 

1009 Intersection

 

1010 Just A Mistake

 

1011 K.Bro Sorting

 

2016.9.15 --- 2014 北京