一道莎莎的交互题(开篇第一课)
Guess Strings
题意
大致意思是给你一个字符串S,有两个字符组成(没错!题目错的!md)长度是2~100,然后每一次可以询问一个字符串s,如果s是S的子串,返回1;反之返回0,在询问不超过200次的前提下得出答案!
题解
没得说了,先找到字符,然后往前找,再往后找,就ok了,不懂想一下就懂了(注意字串)。
意义
很简单的题目,放上来的主要意义在于之前没写过这一类的交互题,而且还是随机数生成结果,因为只有两个字符所以期望是50%和50%,直接for的话必TLE,嗯,没其他的了。
AC代码
#include<bits/stdc++.h> using namespace std; int ask(string s){ cout<<"ASK "<<s<<endl; fflush(stdout);//交互题目重点 //也可以写成cout.flush()和cin.flush() int a; cin>>a; return a; } int create(int i){ return (unsigned long long)rand()*(unsigned long long)rand()%i;//更加随机生成数 } int main(){ srand((int)time(NULL));//产生随机数,不加这个多次会不随机 int number=0; string have[2]; for(int i=0;i<26;i++){ if(number==2)break; string s; s+=('a'+i); int res=ask(s); if(res==1){ have[number++]=s; } }//找到字符 string s; s=have[0]+have[1]; if(!ask(s))reverse(s.begin(),s.end());//判断长度为2时的情况 while(1){//往后找 int pos=create(2); string temp=s+have[pos]; if(ask(temp)){ s=temp; }else { temp=s+have[pos^1]; if(ask(temp)){ s=temp; }else { break; } } } while(1){//往后找 int pos=create(2); string temp=have[pos]+s; if(ask(temp)){ s=temp; }else { temp=have[pos^1]+s; if(ask(temp)){ s=temp; }else { break; } } } cout<<"ANSWER "<<s<<endl; return 0; }
暂时先这样写吧,其他修改后面再补
作者:第三个草

浙公网安备 33010602011771号