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 }