Codeforces Round #612题解
A题
只需要找到A中后面跟的最长的p串是几个即可
#include<iostream> #include<cstring> #include<string> #include<map> #include<vector> #include<cstdio> using namespace std; int main(){ int t; cin>>t; string s; int n; int i; while(t--){ cin>>n; cin>>s; int ans=0; int cnt=0; for(i=n-1;i>=0;i--){ if(s[i]=='P') cnt++; else{ ans=max(ans,cnt); cnt=0; } } cout<<ans<<endl; } }
B题
关键点是发现如果确定两个,那么第三个即可推出,看题要仔细,要认真发掘题目性质
#include<iostream> #include<cstring> #include<string> #include<map> #include<vector> #include<cstdio> using namespace std; const int N=10010; map<string,int> m1; string s[N]; int main(){ int i,j; int n,k; cin>>n>>k; for(i=0;i<n;i++){ cin>>s[i]; m1[s[i]]+=1; } int num=0; for(i=0;i<n;i++){ for(j=i+1;j<n;j++){ int t; string res=""; for(t=0;t<k;t++){ if(s[i][t]==s[j][t]) res+=s[i][t]; else{ res+=(236-s[i][t]-s[j][t]); } } if(m1[res]) num++; } } cout<<num/3<<endl; }
C题
动态规划,常用的在前i个中求最小或最大,根据经验,可以按照题目性质来列状态,例如本题可以观察得出,有奇数偶数的区别,所以可以将这两个设为两维,另需添一维表述当前位置的状态
此类动态规划题常见且套路清晰。
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<map> #include<vector> #include<cstdio> using namespace std; const int N=105; int f[N][N][N][2]; int a[N]; int main(){ int i; int n; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; memset(f,0x3f,sizeof f); int num1,num2; if(n%2){ num1=n/2+1; num2=n/2; } else{ num1=num2=n/2; } int j,k; f[0][0][0][0]=f[0][0][0][1]=0; for(i=1;i<=n;i++){ for(j=0;j<=num1;j++){ for(k=0;k<=num2;k++){ if(a[i]==0){ if(k>0) f[i][j][k][0]=min(f[i-1][j][k-1][0],f[i-1][j][k-1][1]+1); if(j>0) f[i][j][k][1]=min(f[i-1][j-1][k][1],f[i-1][j-1][k][0]+1); } else{ if(a[i]%2){ if(j>0) f[i][j][k][1]=min(f[i-1][j-1][k][1],f[i-1][j-1][k][0]+1); } else{ if(k>0) f[i][j][k][0]=min(f[i-1][j][k-1][0],f[i-1][j][k-1][1]+1); } } } } } cout<<min(f[n][num1][num2][1],f[n][num1][num2][0])<<endl; }
D题--待补
没有人不辛苦,只有人不喊疼