CF519 ABCD D. A and B and Interesting Substrings(map,好题)
A:http://codeforces.com/problemset/problem/519/A
水题没什么好说的。
#include <iostream> #include <string.h> #include <stdio.h> #include <math.h> #include <algorithm> #include <queue> #define inf 0x3f3f3f3f using namespace std; char ma[10][10]; int su,su2; int main() { while(scanf("%s",ma[0])!=EOF) { su=0; su2=0; for(int i=1;i<8;i++) scanf("%s",ma[i]); for(int i=0;i<8;i++) { for(int j=0;j<8;j++) { if(ma[i][j]=='Q') { su+=9; } else if(ma[i][j]=='q') { su2+=9; } else if(ma[i][j]=='R') { su+=5; } else if(ma[i][j]=='r') { su2+=5; } else if(ma[i][j]=='B') { su+=3; } else if(ma[i][j]=='b') { su2+=3; } else if(ma[i][j]=='N') { su+=3; } else if(ma[i][j]=='n') { su2+=3; } else if(ma[i][j]=='P') { su+=1; } else if(ma[i][j]=='p') { su2+=1; } else if(ma[i][j]=='K') { su+=0; } else if(ma[i][j]=='k') { su2+=0; } } } if(su>su2) printf("White\n"); else if(su==su2) { printf("Draw\n"); } else printf("Black\n"); } return 0; }
B:http://codeforces.com/problemset/problem/519/B
水题,简单排序即可。
#include <iostream> #include <algorithm> #include <math.h> #include <map> #include <queue> #include <stack> #define inf 0x3f3f3f3f #include <stdio.h> #include <string.h> typedef __int64 ll; #define mod 10000007 using namespace std; int n,a[100010],b[100010],c[100010],k; ll sum; int main() { while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d",&a[i]); } for(int i=0;i<n-1;i++) { scanf("%d",&b[i]); } b[n-1]=-1; for(int i=0;i<n-2;i++) { scanf("%d",&c[i]); } c[n-1]=-2; c[n-2]=-3; sort(a,a+n); sort(b,b+n-1); sort(c,c+n-2); for(int i=0;i<n;i++) { if(b[i]!=a[i]) { printf("%d\n",a[i]); break; } } for(int i=0;i<n-1;i++) { if(c[i]!=b[i]) { printf("%d\n",b[i]); break; } } } return 0; }
C:http://codeforces.com/problemset/problem/519/C
给你n个老手,m的新手,有两种组队方式,一种是1个老手带两个新手,另外一种是2个老手带一个新手,求最多的组队对数。
我是暴力求的,记得还有一种方法,不会算了。
#include <iostream> #include <algorithm> #include <math.h> #include <map> #include <queue> #include <stack> #define inf 0x3f3f3f3f #include <stdio.h> #include <string.h> typedef __int64 ll; #define mod 10000007 using namespace std; int n,m; ll sum; int main() { while(scanf("%d%d",&n,&m)!=EOF) { sum=0; while(n>0&&m>0) { if(n>=m&&n>=2) { sum++; n-=2; m-=1; } else if(m>=2) { sum++; n-=1; m-=2; } else break; } printf("%I64d\n",sum); } return 0; }
D. A and B and Interesting Substrings
题意:在给的一个串,每个字母有固定的权值求满足如下条件的子串的数目
1 该子串的首字母和尾字母相同
2 该串除了首尾字母外,其他字母的权值和为0
思路:维护一个前缀和,用了26个hash分别记录了26种字母每个的前缀和,如果遇到了一个'a',就检查之前有几个和他的前缀和一样的'a',在和上加上去,并维护前缀和。
map真的是好牛逼,可惜比赛的时候没想到,希望以后会用吧!
#include <iostream> #include <algorithm> #include <math.h> #include <map> #include <queue> #include <stack> #define inf 0x3f3f3f3f #include <stdio.h> #include <string.h> typedef __int64 ll; #define mod 10000007 using namespace std; int h[30]; char s[100010]; ll sum,cnt; int main() { while(scanf("%d",&h[0])!=EOF) { cnt=0; sum=0; for(int i=1;i<26;i++) { scanf("%d",&h[i]); } scanf("%s",s); int l=strlen(s); map<ll,ll>q[30]; //map<ll,int>q[30]; for(int i=0;i<l;i++) { cnt+=q[s[i]-'a'][sum]; sum+=h[s[i]-'a']; q[s[i]-'a'][sum]++; } printf("%I64d\n",cnt); } return 0; }