码迷,mamicode.com
首页 > 其他好文 > 详细

2016.9.15 --- 2014 北京

时间:2016-09-17 10:46:22      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

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 北京

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/5878035.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!