前言
有时,我们会在 XCPC 的比赛中遇到交互题,我们需要通过有限次查询来输出最终的答案。在这类问题中,输入的数据可能不是预先定好的,而是针对你的查询来给出相应的输出。
下面是例题时间
Codeforces 679A
题意是,Limak 会从 [2,100] 中随机生成一个整数,你需要在20次询问内判断出这个整数是质数还是合数。所谓质数,就是因子只有1和它本身的数字。每次询问你可以输出一个数字,程序会返回一个输入告诉你这个隐藏的整数能否被你输入的数字整除。
思路是,我们要构造一个20次及以内的查询数组,要保证从2到100的数字的质数不能被整除或是只能被这个查询数组整除一次,而合数要在这个数组中有至少两个因子。
尝试构造这个数组:
#include<bits/stdc++.h>
#define fi first
#define se second
#define ffl fflush(stdout)
using namespace std;
typedef unsigned long long ll;
const int NUM=60;
void solve(){
int lib[]={
2,3,5,7,11,
13,17,19,23,29,
31,37,41,43,47,
53,4,9,25,49};
bool vis[105];
memset(vis,0,sizeof(vis));
for(int i=0;i<20;++i){
int j=lib[i];
vis[j]=1;
while(j<=100){
vis[j]=1;
j+=lib[i];
}
}
bool ok=1;
for(int i=2;i<=100;++i){
//只要保证这里输出的数字都是质数,就能满足我们的构造条件啦~
if(!vis[i]){
ok=0;
cout<<i<<"!!\n";
}
}
cout<<ok;
return ;
}
int main(void){
int t=1;
while(t--){
solve();
if(t)cout<<"\n";
}
return 0;
}
AC代码:
#include<bits/stdc++.h>
#define fi first
#define se second
#define ffl fflush(stdout)
using namespace std;
typedef unsigned long long ll;
void solve(){
int lib[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,4,9,25,49};
int cnt=0;
for(int i=0;i<19;++i){
cout<<lib[i]<<"\n";
ffl;
string s;
cin>>s;
cnt+=s=="yes";
if(cnt>1){
cout<<"composite";
return;
}
}
cout<<"prime";
return ;
}
int main(void){
int t=1;
while(t--){
solve();
if(t)cout<<"\n";
}
return 0;
}
Codeforces 1505A
题意是,耐心回答提问者的问题,你不会知道提问者查询的数量,对于每句话输出 NO ,确保在每次响应后使用流刷新操作,以避免将部分输出留在某个缓冲区中。
不断读取输出循环直到行末即可。
#include<bits/stdc++.h>
#define fi first
#define se second
#define ffl fflush(stdout)
using namespace std;
typedef unsigned long long ll;
void solve(){
string s;
while(getline(cin,s)){
cout<<"NO\n";
ffl;
}
return ;
}
int main(void){
int t=1;
while(t--){
solve();
if(t)cout<<"\n";
}
return 0;
}
后记
后面有空再更