不喜废话,这题实在耗我很长时间。主要浪费在区间边界的特判。自然界的对称性很好,我们往往可以考虑特殊情况,处理了一半,另一半相似的推出。这题,比较容易猜出一个优先级。即{1,1},{0,1},{1,0}{0,0} 不影响答案根据{1,1}出现的次数的奇偶性等价成0,1然后统计{0,1}{1,0}出现次数特判一下吧。。纸上画一下。。这题有一个特点就是很多东西都互相抵消了,这就出现了一个常见的情况,余2为偶结果+1。意会吧。
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> using namespace std; string s1,s2; int main(){ int n; cin>>n; cin>>s1>>s2; int flag=0; int res1=0,res2=0,ans1=0,ans2=0; for(int i=0;i<2*n;i++){ if(s1[i]=='1'&&s2[i]=='0') res1++; if(s2[i]=='1'&&s1[i]=='0') res2++; if(s2[i]=='1' && s1[i]=='1') flag++; } if(flag%2==1){ ans1+=1; if(res1-res2>1){ if((res1-res2)%2==0) ans1+=(res1-res2)/2+1; else ans1+=(res1-res2)/2; } else if(res2-res1>=1){ if((res2-res1)%2==0) ans2+=(res2-res1)/2; else ans2+=(res2-res1)/2+1; } } else{ if(res1-res2>=1) ans1+=1; else if(res2-res1>1){ ans2+=1; } } if(ans1>ans2){ cout<<"First"<<endl;return 0;} else if(ans1<ans2){ cout<<"Second"<<endl;return 0;} cout<<"Draw"<<endl; return 0; }