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;}
題目B——賺經驗
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;}
題目C——數列
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;elsecout<<f[c]<<endl;}}
題目D——單詞混合
DFS可做,DP也可以。DFS+DP也可以。狀態轉移方程不是自己想的,思路如下。(轉自Hzh_000)
最優子結構分析:如上例,如果A、B可以組成C,那麼,C最後一個字母e,必定是 A 或 C 的最後一個字母組成。C去除除最後一位,就變成是否可以求出 A-1和B 或者 A與B-1 與 是否可以構成 C-1。。。狀態轉移方程: 用f[i][j] 表示 表示A前 i 為 和B 前j 位是否可以組成 C的前i+j位
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;}}}