A题 http://codeforces.com/problemset/problem/699/A
非常的水,两个相向而行,且间距最小的点,搜一遍就是答案了。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 struct node 5 { 6 int x;char ch; 7 }s[200000+50]; 8 bool cmp(node& a,node& b) 9 { 10 return a.x<b.x; 11 } 12 int main() 13 { 14 int n; 15 while(~scanf("%d",&n)) 16 { 17 getchar(); 18 for(int i=0;i<n;i++) 19 scanf("%c",&s[i].ch); 20 for(int i=0;i<n;i++) 21 scanf("%d",&s[i].x); 22 sort(s,s+n,cmp); 23 int ans = 0x3f3f3f3f; 24 for(int i=1;i<n;i++) 25 { 26 if(s[i].ch == ‘L‘ && s[i-1].ch == ‘R‘) 27 { 28 int dis= (s[i].x - s[i-1].x)/2; 29 ans = min(ans,dis); 30 } 31 } 32 if(ans == 0x3f3f3f3f) 33 printf("-1\n"); 34 else 35 printf("%d\n",ans); 36 } 37 return 0; 38 }
B题 http://codeforces.com/problemset/problem/699/B
讲道理 也是水题 然而我在实现的时候 实现不好这个问题 然而梦天2333 毕竟天神啪啪啪随便写写就A了。
这个代码是参考网上的思路搞的,关键是一个V数组和一个C数组记录,行和列的情况。
还有读入字符串的时候要小心的,因为它题目中默认的地图是从1开始的,如果直接scanf ma[i]这样读进来 就是每行都从0开始了,和题意不符
1 scanf("%s",ma[i]+1);//输入的一个小技巧
其实思路和它标程是一样的,就是没码出来。
1 #include <cstdio> 2 #include <cstring> 3 #define mem0(x) memset(x,0,sizeof(x)) 4 char ma[1005][1005]; 5 int R[1000050],C[1000050]; 6 int tot,fi,fj,n,m; 7 bool judge() 8 { 9 for(int i=1;i<=n;i++) 10 { 11 for(int j=1;j<=m;j++) 12 { 13 int cur = R[i] + C[j]; 14 if(ma[i][j] == ‘*‘) cur--; 15 if(tot == cur) 16 { 17 fi = i, fj = j; 18 return true; 19 } 20 21 } 22 } 23 return false; 24 } 25 int main() 26 { 27 while(~scanf("%d%d",&n,&m)) 28 { 29 mem0(R); 30 mem0(C); 31 for(int i=1;i<=n;i++) 32 scanf("%s",ma[i]+1);//输入的一个小技巧 33 tot = 0; 34 for(int i=1;i<=n;i++) 35 for(int j=1;j<=m;j++) 36 if(ma[i][j] == ‘*‘) 37 { 38 R[i] ++; 39 C[j] ++; 40 tot++; 41 } 42 if(judge()) 43 printf("YES\n%d %d\n",fi,fj); 44 else 45 printf("NO\n"); 46 } 47 return 0; 48 }
C题 http://codeforces.com/problemset/problem/698/A
dp,小心一下 任何一种情况下都是能选择休息的。
1 #include <cstdio> 2 #include <map> 3 #include <queue> 4 #include <cstring> 5 #include <algorithm> 6 #include <iostream> 7 using namespace std; 8 #define mem0(x) memset(x,0,sizeof(x)) 9 #define mem1(x) memset(x,-1,sizeof(x)) 10 typedef long long LL; 11 const int INF = 0x3f3f3f3f; 12 13 14 int a; 15 int dp[105][3]; 16 int main() 17 { 18 int n; 19 scanf("%d",&n); 20 for(int i=1;i<=n;i++) 21 { 22 scanf("%d",&a); 23 if(a == 0) 24 { 25 dp[i][0] = max(max(dp[i-1][0], dp[i-1][1]), dp[i-1][2]); 26 } 27 else if(a == 1) 28 { 29 dp[i][0] = max(max(dp[i-1][0],dp[i-1][1]),dp[i-1][2]); 30 dp[i][1] = max(dp[i-1][0], dp[i-1][2]) + 1; 31 } 32 else if(a == 2) 33 { 34 dp[i][0] = max(max(dp[i-1][0],dp[i-1][1]),dp[i-1][2]); 35 dp[i][2] = max(dp[i-1][0], dp[i-1][1]) + 1; 36 } 37 else 38 { 39 dp[i][0] = max(max(dp[i-1][0],dp[i-1][1]),dp[i-1][2]); 40 dp[i][1] = max(dp[i-1][0], dp[i-1][2]) + 1; 41 dp[i][2] = max(dp[i-1][0], dp[i-1][1]) + 1; 42 } 43 } 44 int maxn = 0; 45 for(int i=0;i<3;i++) 46 maxn = max(maxn, dp[n][i]); 47 printf("%d\n",n-maxn); 48 return 0; 49 }
D题 http://codeforces.com/problemset/problem/698/B
这题挺难想的当时。先思考整个问题,无非是由若干个环和若干棵树来组成了最初的图。
如果都是树,那么很好解决,选一棵树作为主树,其他的树根直接链接到主树的根上就解决问题了,修改次数应该是根结点的总数目-1。
如果都是环,那么,把某个环的某个结点接到自己身上,形成一棵树之后,其他的环直接接上来就好了。
如果是环和树都有,那么只要把环接到主树上就好了。
1 #include <cstdio> 2 #include <map> 3 #include <queue> 4 #include <cstring> 5 #include <algorithm> 6 #include <iostream> 7 using namespace std; 8 #define mem0(x) memset(x,0,sizeof(x)) 9 #define mem1(x) memset(x,-1,sizeof(x)) 10 typedef long long LL; 11 const int INF = 0x3f3f3f3f; 12 13 int a[200005]; 14 int pa[200005]; 15 int uf_find(int x) 16 { 17 if(x==pa[x]) return x; 18 return pa[x] = uf_find(pa[x]); 19 } 20 21 int main() 22 { 23 int n,cnt,root; 24 scanf("%d",&n); 25 //uf_init 26 for(int i=1;i<=n;i++) pa[i] = i ; 27 28 cnt = 0, root = 0; 29 for(int i=1;i<=n;i++) 30 { 31 scanf("%d",&a[i]); 32 if(i == a[i]) 33 { 34 cnt++,root = i; 35 } 36 else 37 { 38 int fx = uf_find(i); 39 int fy = uf_find(a[i]); 40 if(fx == fy) a[i] = i,cnt++;//成环 41 else pa[fx] = fy; 42 } 43 } 44 if(root == 0) 45 { 46 for(int i=1;i<=n;i++) 47 { 48 if(i == pa[i]) 49 { 50 root = i; 51 break; 52 } 53 } 54 cnt++; 55 } 56 printf("%d\n",cnt-1); 57 for(int i=1;i<=n;i++) 58 { 59 if(i == a[i]) a[i] = root;//根只能有一个 60 printf("%d%c",a[i],i==n?‘\n‘:‘ ‘); 61 } 62 return 0; 63 }
时间: 2024-10-10 10:01:01