2016 Al-Baath University Training Camp Contest-1 |
---|
A题:http://codeforces.com/gym/101028/problem/A
题意:比赛初始值是1500,变化了几次,得到的正确结果和bug后的是否相等。(Tourist大佬好 Y(^o^)Y)
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() 6 { 7 int t; 8 cin>>t; 9 while(t--) { 10 int n,r; 11 cin>>n>>r; 12 13 int sum = 1500; 14 for(int i=0;i<n;i++) 15 { 16 int x; 17 cin>>x; 18 sum+=x; 19 } 20 21 if(sum==r) 22 puts("Correct"); 23 else puts("Bug"); 24 25 } 26 return 0; 27 }
B题:http://codeforces.com/gym/101028/problem/B
题意:b,p不分,i,e不分,大小写不分,看两个字符串是不是正确的。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 char str1[105],str2[105]; 6 7 int main() 8 { 9 int t; 10 cin>>t; 11 while(t--) { 12 scanf("%s%s",str1,str2); 13 14 int len = strlen(str1); 15 16 if(strlen(str1)!=strlen(str2)) { 17 puts("No"); 18 continue; 19 } 20 21 for(int i=0;i<len;i++) 22 { 23 if(str1[i]>='A'&&str1[i]<='Z') 24 str1[i] = 'a' + str1[i] - 'A'; 25 26 if(str2[i]>='A'&&str2[i]<='Z') 27 str2[i] = 'a' + str2[i] - 'A'; 28 } 29 30 bool flag = true; 31 for(int i=0;i<len;i++) { 32 if(str1[i]!=str2[i]) { 33 if(str1[i]=='b'&&str2[i]=='p') 34 continue; 35 if(str1[i]=='p'&&str2[i]=='b') 36 continue; 37 if(str1[i]=='i'&&str2[i]=='e') 38 continue; 39 if(str1[i]=='e'&&str2[i]=='i') 40 continue; 41 flag = false; 42 break; 43 } 44 } 45 46 if(flag) 47 puts("Yes"); 48 else puts("No"); 49 50 51 52 } 53 return 0; 54 }
C题:http://codeforces.com/gym/101028/problem/C
题意:已知A,B,求C有多少种情况满足这个式子:
比赛的时候,很多同学没有看到取模,用java干;
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() 6 { 7 int t; 8 cin>>t; 9 while(t--) { 10 int len; 11 cin>>len; 12 int a[105],b[105]; 13 char stra[105],strb[105]; 14 scanf("%s%s",stra,strb); 15 for(int i=0;i<len;i++) 16 { 17 a[i] = stra[i]-'0'; 18 b[i] = strb[i]-'0'; 19 } 20 unsigned long long ans = 1; 21 bool flag = true; 22 for(int i=0;i<len;i++) { 23 if(a[i]==0&&b[i]==0) 24 continue; 25 if(a[i]==0&&b[i]==1) 26 continue; 27 if(a[i]==1&&b[i]==0){ 28 flag = false; 29 break; 30 } 31 if(a[i]==1&&b[i]==1) 32 ans = ans*2%1000000007; 33 } 34 if(flag) 35 cout<<ans<<endl; 36 else puts("IMPOSSIBLE"); 37 } 38 39 return 0; 40 }
D题:http://codeforces.com/gym/101028/problem/D
题意:画图
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 char maps[105][105]; 6 7 int main() 8 { 9 int t; 10 scanf("%d",&t); 11 while(t--) 12 { 13 memset(maps,'.',sizeof(maps)); 14 15 int r,c,n; 16 cin>>r>>c>>n; 17 18 while(n--) 19 { 20 21 int r1, c1, r2, c2; 22 char x; 23 cin>>r1>>c1>>r2>>c2>>x; 24 25 for(int i=r1; i<=r2; i++) 26 { 27 for(int j=c1; j<=c2; j++) 28 { 29 maps[i][j] = x; 30 } 31 } 32 33 34 } 35 for(int i=1; i<=r; i++) 36 { 37 for(int j=1; j<=c; j++) 38 printf("%c",maps[i][j]); 39 puts(""); 40 } 41 42 } 43 return 0; 44 }
E题:http://codeforces.com/gym/101028/problem/E
题意:n个数的最大公约数
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int inf = 0x3f3f3f3f; 6 7 int main() 8 { 9 int t; 10 int a[1005]; 11 scanf("%d",&t); 12 while(t--) { 13 int minx = inf; 14 int n; 15 scanf("%d",&n); 16 for(int i=0;i<n;i++) { 17 scanf("%d",&a[i]); 18 minx = min(minx,a[i]); 19 } 20 21 int k; 22 for(k=minx;k>=1;k--) { 23 bool flag = true; 24 for(int i=0;i<n;i++) { 25 if(a[i]%k!=0) { 26 flag = false; 27 break; 28 } 29 } 30 if(flag) 31 break; 32 } 33 int num = 0; 34 for(int i=0;i<n;i++) 35 num+=(a[i]/k); 36 printf("%d %d ",k,num); 37 38 39 } 40 return 0; 41 }
F题:http://codeforces.com/gym/101028/problem/F
题意:字符串匹配(朴素匹配就ok了)
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 char str1[1005],str2[4]; 5 int main() 6 { 7 int t; 8 cin>>t; 9 while(t--) 10 { 11 scanf("%s%s",str1,str2); 12 int len = strlen(str1); 13 14 char op[4][3]; 15 memset(op,0,sizeof(op)); 16 17 for(int i=0; i<4; i++) 18 { 19 int k=0; 20 for(int j=0; j<4; j++) 21 { 22 if(i!=j) 23 op[i][k++] = str2[j]; 24 } 25 } 26 27 // for(int i=0;i<4;i++) { 28 // for(int j=0;j<3;j++) 29 // printf("%c",op[i][j]); 30 // puts(""); 31 // } 32 33 bool good = false; 34 for(int i=0; i<len-3; i++) 35 { 36 if(str1[i]==str2[0]&&str1[i+1]==str2[1]&&str1[i+2]==str2[2]&&str1[i+3]==str2[3]) 37 { 38 good = true; 39 break; 40 } 41 } 42 43 if(good) 44 { 45 puts("good"); 46 continue; 47 } 48 49 bool al = false; 50 for(int i=0; i<len-2; i++) 51 { 52 if(str1[i]==op[0][0]&&str1[i+1]==op[0][1]&&str1[i+2]==op[0][2]) 53 { 54 al = true; 55 break; 56 } 57 } 58 59 if(al) 60 { 61 puts("almost good"); 62 continue; 63 } 64 65 al = false; 66 for(int i=0; i<len-2; i++) 67 { 68 if(str1[i]==op[1][0]&&str1[i+1]==op[1][1]&&str1[i+2]==op[1][2]) 69 { 70 al = true; 71 break; 72 } 73 } 74 75 if(al) 76 { 77 puts("almost good"); 78 continue; 79 } 80 81 al = false; 82 for(int i=0; i<len-2; i++) 83 { 84 if(str1[i]==op[2][0]&&str1[i+1]==op[2][1]&&str1[i+2]==op[2][2]) 85 { 86 al = true; 87 break; 88 } 89 } 90 91 if(al) 92 { 93 puts("almost good"); 94 continue; 95 } 96 97 al = false; 98 for(int i=0; i<len-2; i++) 99 { 100 if(str1[i]==op[3][0]&&str1[i+1]==op[3][1]&&str1[i+2]==op[3][2]) 101 { 102 al = true; 103 break; 104 } 105 } 106 107 if(al) 108 { 109 puts("almost good"); 110 continue; 111 } 112 113 puts("none"); 114 115 } 116 return 0; 117 }
G题:http://codeforces.com/gym/101028/problem/G
题意:从左上角砸东西到目的地,途中碰壁。看可以不可以砸到目标。和省赛的球的碰撞类似。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int main() 6 { 7 int t; 8 cin>>t; 9 while(t--) { 10 11 int h,w,d; 12 cin>>h>>w>>d; 13 14 int x = (h-1)/(w-1); //x个单周期 15 int mod = (h-1)%(w-1); 16 17 int md; 18 if(x%2==0) 19 md = 1 + mod; 20 else md = w - mod ; 21 22 if(md==d) 23 puts("Yes"); 24 else puts("No"); 25 26 } 27 return 0; 28 }
H题:http://codeforces.com/gym/101028/problem/H
做到这里的时候,脑子已经晕掉了,题目也没怎么看清楚。
题意:n长的河流,两个人的速度是d,r,在start的位置不标记,求第一次踩到对方标记的时间。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int v1[100005]; 6 int v2[100005]; 7 8 int main() 9 { 10 int t; 11 cin>>t; 12 while(t--) 13 { 14 memset(v1,0,sizeof(v1)); 15 memset(v2,0,sizeof(v2)); 16 int n,d,r; 17 cin>>n>>d>>r; 18 19 int ans = 1; 20 int td = d; 21 int tr = r; 22 v1[td] = 1; 23 v2[tr] = 1; 24 while(true) 25 { 26 if(v2[td]==true||v1[tr]==true) 27 { 28 break; 29 } 30 ans++; 31 td = (td + d)%n; 32 tr = (tr + r)%n; 33 v1[td] = true; 34 v2[tr] = true; 35 } 36 printf("%d ",ans); 37 38 } 39 return 0; 40 }
I题:http://codeforces.com/gym/101028/problem/I
题意:屋顶有漏洞,用k个布去补洞,其中最长的布,使其最短。
二分啊!
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int a[100005]; 6 int n,k; 7 int maxx; 8 bool calc(int x) { 9 int cur = 0; 10 for(int i=0;i<k;i++) { 11 if(cur==0) 12 cur = cur + a[0] + x -1; 13 else { 14 for(int i=0;i<n;i++) { 15 if(a[i]>cur) 16 { 17 cur = a[i]; 18 break; 19 } 20 } 21 cur = cur + x -1; 22 } 23 } 24 if(cur>=a[n-1]) 25 return true; 26 return false; 27 } 28 29 int main() 30 { 31 int t; 32 cin>>t; 33 while(t--) { 34 cin>>n>>k; 35 for(int i=0;i<n;i++) 36 scanf("%d",&a[i]); 37 maxx = a[n-1]; 38 int l=1; 39 int r=a[n-1]/k+1; 40 while(l<r) { 41 int m = (r+l)/2; 42 if(calc(m)) 43 r=m; 44 else l = m+1; 45 } 46 printf("%d ",l); 47 } 48 return 0; 49 }
J题:http://codeforces.com/gym/101028/problem/J
题意:
一个数列a,他的最大的2i 的因子,由 i 组成的一个数列。
找一些a,他是递增的基础上,i 之和最大。
dp啊!
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int a[105]; 6 int as[105]; 7 int b[105]; 8 int dp[105]; 9 10 int main() 11 { 12 int t; 13 cin>>t; 14 while(t--) 15 { 16 memset(b,0,sizeof(b)); 17 memset(dp,0,sizeof(dp)); 18 19 int n; 20 cin>>n; 21 for(int i=0; i<n; i++) { 22 cin>>a[i]; 23 as[i] = a[i]; 24 } 25 26 for(int i=0; i<n; i++) 27 { 28 while(as[i]%2==0) 29 { 30 b[i]++; 31 as[i] /=2; 32 } 33 } 34 35 dp[0] = b[0]; 36 37 for(int i=1; i<n; i++) 38 { 39 int k = 0; 40 for(int j=0; j<i; j++) 41 { 42 if(a[j]<a[i]&&k<dp[j]) 43 { 44 k = dp[j]; 45 } 46 } 47 dp[i] = k+b[i]; 48 } 49 50 int ans = -1; 51 for(int i=0; i<n; i++) 52 { 53 ans = max(ans,dp[i]); 54 } 55 cout<<ans<<endl; 56 57 } 58 59 return 0; 60 }
最后贴一下Rank.