学习一种新题型,交互题
fflush(stdout);用来清空缓冲区
交互题不用 fflush(stdout) ,用 cout<<endl 来清空缓冲区一样的效果,交互题中每次输出内容后cout后需要清空缓冲区,输出一行fflush(stdout),否则会Idleness limit exceeded
一般以输出提问方式cout<<?
用输入方式获得答案cin>>
最后用cout<<!输出解题结果,主要看题目要求要再几次提问次数下,尽量用二分,前缀和等减少提问次数
例题Problem - 1425F - Codeforces
n个数组成的序列,要求提问次数小于等于n次,获得这n个数的正确次序,每次可以提问一个区域的数的和,举例n=6,可以问1到6,1到5,1到4,1到3,1到2的和,记为sum[6],sum[5]....sum[2],再用a[6]=sum[6]-sum[5],最终a[1]和a[2]的解法是,询问2到3的区域和记为sum23,a[2]=sum23-a[3],a[1]=sum2-a[2],最终刚好询问n次可以得到每个数
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e3+10;
int sum[N],a[N],sum23;
signed main()
{
int n;
cin>>n;
for(int i=n;i>=2;i--)
{
cout<<"? 1 "<<i<<endl;//用输出提问
fflush(stdout);//清空缓存
cin>>sum[i];//用输入方法读回答
}
for(int i=n;i>=3;i--)
{
a[i]=sum[i]-sum[i-1];
}
cout<<"? 2 3"<<endl;
fflush(stdout);
cin>>sum23;
a[2]=sum23-a[3];
a[1]=sum[2]-a[2];
cout<<"! ";//表示开始输出答案
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
Problem - 1167B - Codeforces通过询问每两个数的乘积得到数的序列
使用到next_permutation全排列函数
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int q1,q2,q3,q4;
int a[7]={0,4,8,15,16,23,42};
int sum=4+8+15+16+23+42;
cout<<"? 1 2"<<endl;
fflush(stdout);
cin>>q1;
cout<<"? 2 3"<<endl;
fflush(stdout);
cin>>q2;
cout<<"? 3 4"<<endl;
fflush(stdout);
cin>>q3;
cout<<"? 4 5"<<endl;
fflush(stdout);
cin>>q4;
int shu[7];
do{
if(a[1]*a[2]==q1&&a[2]*a[3]==q2&&a[3]*a[4]==q3&&a[4]*a[5]==q4)
{
shu[1]=a[1];
shu[2]=a[2];
shu[3]=a[3];
shu[4]=a[4];
shu[5]=a[5];
break;
}
}while(next_permutation(a+1,a+6+1));//6个数全排列,找符合的a[1]到a[5]
shu[6]=sum-shu[1]-shu[2]-shu[3]-shu[4]-shu[5];
cout<<"! ";
for(int i=1;i<=6;i++)
{
cout<<shu[i]<<" ";
}
return 0;
}