Codeforces Round #669 (Div. 2) C (交互题)

题意:

交互题~
输入一个n,代表一个1-n的全排列
最多2*n次询问,每次询问: ? a b,系统会返回第a个位置的数mod第b个位置的数的结果。
(既P_a %P_b )
问:这个排列是什么???

题解:

对于一对位置,我们做两次询问: ? a b , 然后询问 ? b a,那么我们就可以得到P_a和P_b中较小的数,每两次操作就可以得到一个数,但是只有这个操作,得不到排列中最大的那个数,所以我们的有效操作次数和必要操作次数其实是2*(n-1),最后一个数必然是n。

#include <bits/stdc++.h>

using namespace std;
const int maxn = 100005;
int ans[maxn];
int main()
{
    
    
	int n;
	cin >> n;
	memset(ans,0,sizeof(ans));
	int f = 1,a,b;
	for(int i=2;i<=n;i++) {
    
    
		cout<<"? "<<f<<' '<<i<<'\n';
		
		cin >> a;
		
		cout<<"? "<<i<<' '<<f<<'\n';
		cin >> b;
		
		if(a > b) {
    
    
			ans[f] = a;
			f = i;
		} else {
    
    
			ans[i] = b;
		}
	}
	cout<<"! ";
	for(int i=1;i<=n;i++)
	{
    
    
		if(ans[i] == 0)printf("%d ",n);
		else printf("%d ",ans[i]);
	}
 } 

猜你喜欢

转载自blog.csdn.net/weixin_44499508/article/details/108554230