Codeforces Round #134 (Div. 2)

怎么感觉这次有点水啊。。3个水。。不过差点悲剧,数组开小了,依旧过了。。。人品吗。。。

A乱搞。数组开小,做到最后想hack,意识到自己的数组开小了,没想到居然也过了。。。写的不好WA了次,18分钟。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #define N 1001
 5 int p[N];
 6 int main()
 7 {
 8     int i,n,k;
 9     scanf("%d%d",&n,&k);
10     for(i = 1;i <= 2*n+1;i ++)
11     scanf("%d",&p[i]);
12     for(i = 1;i <= n;i ++)
13     {
14         if(p[2*i]-1>p[2*i-1]&&p[2*i]-1>p[2*i+1])
15         {
16             p[2*i] --;
17             k --;
18         }
19         if(k == 0)
20         break;
21     }
22     for(i = 1;i <= 2*n+1;i ++)
23     {
24         if(i == 1)
25         printf("%d",p[i]);
26         else
27         printf(" %d",p[i]);
28     }
29     printf("\n");
30     return 0;
31 }

B题 我用优先队列做的,对STL,不太熟,翻出以前代码,网上还搜了一下优先队列。。。好假,37分钟。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 #include <vector>
 5 #include <algorithm>
 6 using namespace std;
 7 int main()
 8 {
 9     int n,i,sum1,m,a,sum2;
10     scanf("%d%d",&n,&m);
11     priority_queue< int ,vector<int>,greater<int> > q;
12     priority_queue<int> q1;
13     for(i = 1; i <= m; i ++)
14     {
15         scanf("%d",&a);
16         q.push(a);
17         q1.push(a);
18     }
19     sum1 = 0;sum2 = 0;
20     for(i = 1; i <= n; i ++)
21     {
22         a = q1.top();
23         q1.pop();
24         sum2 += a;
25         a--;
26         if(a > 0)
27         q1.push(a);
28         a = q.top();
29         q.pop();
30         sum1 += a;
31         a --;
32         if(a > 0)
33         q.push(a);
34     }
35     printf("%d %d\n",sum2,sum1);
36     return 0;
37 }

C 裸并查集,确实想了好长 时间,思路 最短路  最小生成树  DP  贪心  最好终于想起上一场有个并查集,这个也是啊。。。纠结。。。无语。。。1小时14分钟。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #define N 1001
 5 int o[N];
 6 int find(int x)
 7 {
 8     int r,t;
 9     r = x;
10     while(x != o[x])
11     x = o[x];
12     while(r != x)
13     {
14         t = o[r];
15         o[r] = x;
16         r = t;
17     }
18     return x;
19 }
20 void merge(int x,int y)
21 {
22     x = find(x);
23     y = find(y);
24     if(x != y)
25     o[x] = y;
26 }
27 int main()
28 {
29     int x[N],y[N];
30     int i,j,n,ans;
31     scanf("%d",&n);
32     for(i = 1;i <= n;i ++)
33     o[i] = i;
34     for(i = 1;i <= n;i ++)
35     scanf("%d%d",&x[i],&y[i]);
36     for(i = 1;i <= n-1;i ++)
37     {
38         for(j = i+1;j <= n;j ++)
39         {
40             if(x[i] == x[j]||y[i] == y[j])
41             {
42                 merge(i,j);
43             }
44         }
45     }
46     ans = 0;
47     for(i = 1;i <= n;i ++)
48     {
49         if(o[i] == i)
50         ans ++;
51     }
52     printf("%d\n",ans-1);
53     return 0;
54 }

 

posted @ 2012-08-18 21:52  Naix_x  阅读(214)  评论(0编辑  收藏  举报