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 }

 

你可能感兴趣的:(codeforces)