在i的基础上j的传递模型(乒乓球)
#include <bits/stdc++.h> using namespace std; const int maxn=63500; char a[maxn]; int cnt=1; inline int in(){ cin>>a[1]; while(a[cnt]!='E') cin>>a[++cnt]; cnt-=1;//cautious:the end } inline int work(){ int ca=0,cb=0;; for(int i=1;i<=cnt;i++){ if(a[i]=='W') ca++; if(a[i]=='L') cb++; if(ca==11 and ca-cb>=2){ if(i!=cnt) cout<<ca<<":"<<cb<<endl; else cout<<ca<<":"<<cb<<endl<<0<<":"<<0<<endl<<endl; ca=0; cb=0; continue; } if(cb==11 and cb-ca>=2){ if(i!=cnt) cout<<ca<<":"<<cb<<endl; else cout<<ca<<":"<<cb<<endl<<0<<":"<<0<<endl<<endl; ca=0; cb=0; continue; } if(ca==11 or cb==11){ for(int j=i+1;j<=cnt;j++){ if(a[j]=='W') ca++; if(a[j]=='L') cb++; if(ca-cb>=2 or cb-ca>=2){ cout<<ca<<":"<<cb<<endl; ca=0; cb=0; i=j; break; } if(j==cnt){ cout<<ca<<":"<<cb<<endl<<endl; ca=0; cb=0; i=cnt+1; break; } } } if(i==cnt){ cout<<ca<<":"<<cb<<endl<<endl; ca=0; cb=0; } } for(int i=1;i<=cnt;i++){ if(a[i]=='W') ca++; if(a[i]=='L') cb++; if(ca==21 and ca-cb>=2){ if(i!=cnt) cout<<ca<<":"<<cb<<endl; else cout<<ca<<":"<<cb<<endl<<0<<":"<<0; ca=0; cb=0; continue; } if(cb==21 and cb-ca>=2){ if(i!=cnt) cout<<ca<<":"<<cb<<endl; else cout<<ca<<":"<<cb<<endl<<0<<":"<<0; ca=0; cb=0; continue; } if(ca==21 or cb==21){ for(int j=i+1;j<=cnt;j++){ if(a[j]=='W') ca++; if(a[j]=='L') cb++; if(ca-cb>=2 or cb-ca>=2){ cout<<ca<<":"<<cb<<endl;//记得最后把修改的地方去掉 ca=0; cb=0; i=j; break; } if(j==cnt){ cout<<ca<<":"<<cb; ca=0; cb=0; i=cnt+1; break; } } } if(i==cnt){ cout<<ca<<":"<<cb; ca=0; cb=0; } } } inline int spe(){ if(cnt==0){ cout<<0<<":"<<0<<endl<<endl; cout<<0<<":"<<0; } } int main(){ in(); work(); spe(); } 优化版(下面) #include<cstdio> using namespace std; int a[5000][2]; int main() { char x; int n11=0,m11=0,n21=0,m21=0,i=0,s; scanf("%c",&x);//输入 while(x!='E')//判断是否结束 { if(x=='W')//如果华华得分 { n11++;//华华的11分制的记录++ n21++;//华华的21分制的记录++ } if(x=='L')//如果对手得分 { m11++;//对手的11分制的记录++ m21++;//对手的21分制的记录++ } if(n11+2<=m11&&m11>=11||m11+2<=n11&&n11>=11)//如果符合要求(11分制) //边读入边处理这样没必要再模拟过程 { printf("%d:%d\n",n11,m11);//直接输出 n11=0;//清零 m11=0;//清零 } if(n21+2<=m21&&m21>=21||m21+2<=n21&&n21>=21)//如果符合要求(21分制) { a[i][0]=n21;//记录华华的分 a[i][1]=m21;//记录对手的分 n21=0;//清零 m21=0;//清零 i++;//记录记录过的位置 } scanf("%c",&x);//再输入一个 } printf("%d:%d\n",n11,m11);//输出残留 printf("\n");//换行 s=i;//记录位置,留出i for(i=0;i<s;i++) printf("%d:%d\n",a[i][0],a[i][1]);//21分制输出 printf("%d:%d\n",n21,m21);//输出残留 return 0; } //类似于在线处理
最新联系,把代码变得更简洁:
#include <bits/stdc++.h>
using namespace std;
#define maxn 63500
char a[maxn];
int cnt=1,ca1,ca2,cb1,cb2;
int main(){
cin>>a[cnt];
if(a[cnt]=='W') ca1++;
if(a[cnt]=='L') cb1++;
while(a[cnt]!='E'){
cin>>a[++cnt];
if(a[cnt]=='W') ca1++;
if(a[cnt]=='L') cb1++;
if(ca1>=11 and ca1-cb1>=2 or cb1>=11 and cb1-ca1>=2){//对逻辑语掌握不熟练这样可以避免重复模拟
cout<<ca1<<":"<<cb1<<endl;
ca1=0; cb1=0;
}
}
cout<<ca1<<":"<<cb1<<endl<<endl;
cnt-=1;
for(int i=1;i<=cnt;i++){
if(a[i]=='W') ca2++;
if(a[i]=='L') cb2++;
if(ca2>=21 and ca2-cb2>=2 or cb2>=21 and cb2-ca2>=2){
if(i!=cnt) cout<<ca2<<":"<<cb2<<endl;
else cout<<ca2<<":"<<cb2;
ca2=0; cb2=0;
}
}
cout<<ca2<<":"<<cb2;
}