明明记得中午交的最后一遍是WA,晚上一看竟然变成了Accepted,好神奇,还有比这来的更突然,更让人鸡冻的吗......
题意:给出一个只有‘0’,‘1’,‘?’组成的字符串,每人每次必修删且只删掉一个,直到字符串剩下两个字符。先手每次都要让剩下的字符串尽可能的大,后手则尽可能的小。
对于有’?‘的则输出所有的情况。
思路:其实这道题就是在讨论0,1,?的个数的关系。当?的变化起不到作用时,显然结果是唯一,起到作用是就要分类讨论了,详见代码。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <algorithm>
#define LL long long
#define Max(a,b) (a) > (b) ? (a) : (b)
#define Min(a,b) (a) < (b) ? (a) : (b)
#define EPS (1e-8)
#define Left (1)
#define Right (-1)
using namespace std;
char s[101000];
int main()
{
int i,l,s0,s1,s2,d1,d0;
char c;
while(cin>>s)
{
s0 = s1 = s2 = 0;
l = strlen(s);
for(i = 0; i < l; ++i)
{
if(s[i] == '0')
s0++;
else if(s[i] == '1')
s1++;
}
s2 = l - s1 - s0;
d1 = d0 = (l-2)/2;
if(l&1)
d1++;
if(d1+2 <= s1)
{
cout<<"11"<<endl;
}
else if(d0+2 <= s0)
{
cout<<"00"<<endl;
}
else if(d0+1 == s0 && d1+1 == s1)
{
for(i = l-1;i >= 0; --i)
{
if(s[i] != s[l-1])
{
cout<<s[i]<<s[l-1]<<endl;
break;
}
}
}
else if( (d0+1 == s0 && d1+1 == s1+s2) || (d0+1 == s0+s2 && d1+1 == s1) )
{
if(s[l-1] == '0')
{
cout<<"00"<<endl;
cout<<"10"<<endl;
}
else if(s[l-1] == '1')
{
cout<<"01"<<endl;
cout<<"11"<<endl;
}
else if(d0+1 == s0 && d1+1 == s1+s2)
{
cout<<"00"<<endl;
cout<<"01"<<endl;
}
else
{
cout<<"10"<<endl;
cout<<"11"<<endl;
}
}
else
{
cout<<"00"<<endl;
cout<<"01"<<endl;
cout<<"10"<<endl;
cout<<"11"<<endl;
}
}
return 0;
}