7.20每日心得

学习一种新题型,交互题

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值