ACM CLUB的一个小比赛,每周一次,前几名可以换一些小东西。
题目:点击打开链接
题目A——整数统计
方法:手动统计相同字符 遇不相同的便输出相同字符的个数。
#include <iostream> #include <cstring> #include <string> using namespace std; int main() { int testcase; cin>>testcase; while(testcase--) { string tar,res; cin>>tar; int count=1; //char p=tar[0]; for(int i=1;i<tar.length();i++) { if(tar[i]==tar[i-1]) { count++; } else { cout<<count; cout<<tar[i-1]; count=1; } } cout<<count<<tar[tar.length()-1]<<endl; } return 0; }
TVVJ的改写,一个简单的贪心问题。先对对面的经验值进行排序,首先依次加上比他自己经验值大的里面最小的,然后依次+2直至最大。最后对所有小于原经验值的怪+1.
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int tar[1007]; bool cmp(int a,int b) { return a<b; } int main() { int testcase; int startpoint; while(cin>>testcase>>startpoint) { for(int i=0;i<testcase;i++) { cin>>tar[i]; } sort(tar,tar+testcase); int count=0,dec; for(int i=0;i<testcase;i++) { if(tar[i]>startpoint) { startpoint+=2; count++; } } dec=testcase-count; cout<<startpoint+dec<<endl; } return 0; }
HDU 1005原型题,一共7*7种情况,注意寻找循环节。
#include <iostream> #include <cstring> #include <cmath> using namespace std; long long f[60]; int main() { long long a,b,c; while(cin>>a>>b>>c) { memset(f,0,sizeof(f)); if(a==0 && b==0 && c==0) break; int start=0,end=0,flag=0; f[1]=1; f[2]=1; for(int i=3;i<=c && flag==0;i++) { f[i]=(a*f[i-1]+b*f[i-2])%7; for(int j=2;j<i;j++) { if(f[i]==f[j] && f[i-1]==f[j-1]) { start=j; end=i; flag=1; break; } } } if(flag==1) cout<<f[start+(c-end)%(end-start)]<<endl; else cout<<f[c]<<endl; } }
DFS可做,DP也可以。DFS+DP也可以。状态转移方程不是自己想的,思路如下。(转自Hzh_000)
dp[i][j]= (dp[i-1][j]&&(a[i]==c[i+j]))||(dp[i][j-1]&&(b[j]==c[i+j]))
//转移方程:( a[i-1] == c [i+j-1] && dp[i-1][j] ) || ( b[j-1] == c[i+j-1] && dp[i][j-1] ) #include <iostream> #include <cstring> #include <string> using namespace std; string a,b,c; int dp[209][209]; int main() { int testcase; cin>>testcase; for(int t=1;t<=testcase;t++) { memset(dp,0,sizeof(dp)); int lena,lenb,lenc; cin>>a>>b>>c; lena=a.length(); lenb=b.length(); for(int i=1;i<=lena;i++) { if(a[i-1]==c[i-1]) dp[i][0]=1; } for(int j=1;j<=lenb;j++) { if(b[j-1]==c[j-1]) dp[0][j]=1; } for(int i=1;i<=lena;i++) { for(int j=1;j<=lenb;j++) { if(( a[i-1] == c[i+j-1] && dp[i-1][j] ) || ( b[j-1] == c[i+j-1] && dp[i][j-1] )) dp[i][j]=1; } } if(dp[lena][lenb]==1) { cout<<"Case "<<t<<": yes"<<endl; } else { cout<<"Case "<<t<<": no"<<endl; } } }