题意:一个人有n个朋友,他给n个朋友在房间内轮流展示图画,到最后画不见了,他想知道是谁偷了画;输入一串字符串(每个字符代表进去参观后出来时,房间内画的状态;0代表画不见了,1代表画还在;?代表不知道);除了小偷可以说慌(任意字符)外,其他人只能说真话;
第一次写,还有许多不足处,希望大家可以指出不足
题解:1:如果只有一个人那么一定就是这个人;2:如果第一个人就说画不见了(0)或者最后一个人说画还在那么他一定说谎了,他一定是小偷。3;如果所有人都是不知道那么所有人都有可能是小偷;4:如果没有人说画不见了,那么最后一个说画还在的(包括说还在的,因为他自己可能就是)到最后都是小偷;5:如果有0,有1,那么小偷一定在第一个0和从0往前的第一个1之间(包括端点);例如1??0;因为只有一个人可以撒谎,所以如果第一个人说谎了,那么第四个人不能说谎,矛盾。所以4个人都有可能是小偷;
上代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e6+1000;
ll t,n,m;
string s;
void solve(string s)
{
ll lens=s.size(),cs=0;
if(s[0]=='0'||s[lens-1]=='1'||lens==1)//特判
{
printf("%d\n",1);
return ;
}
else
{
ll xb=0,ans=0,xb1=0;
bool flag=0;
for(int i=0;i<lens;i++)
{
if(s[i]=='0')//0的位置
{
xb=i;
break;
}
}
for(int i=lens-1;i>=0;i--)//1的位置
{
if(s[i]=='1'){
xb1=i;
break;
}
}
if(xb==0)
{
if(xb1==0)printf("%lld\n",lens);//如果都是?情况下
else printf("%lld\n",lens-xb1);//有1和?情况下
}
else{
for(int i=xb;i>=0;i--)
{
if(s[i]=='1')
{
ans++;
break;
}
ans++;
}
printf("%lld\n",ans);//1-0之间
}
}
}
int main(){
cin>>t;
while(t--)
{
cin>>s;
solve(s);
}
return 0;
}
xd,jm们多给点意见吧,第一次写太难了,随便给个赞吧