题目链接:https://codeforces.com/contest/1407/problem/C
题目大意:交互题:你可以询问一个数组的两个下标i,j,机器返回 a[i] % a[j] 的值,最多可以询问2次,最后输出数组
题目思路:先询问 a[i] % a[j] 的值p,再询问 a[j] % a[i] 的值q,如果p更大,a[i] = p,否则 a[j] = q,我们设一个k,每次将不确定的值与下一个作比较
题目坑点: ①结束时先输出 ”!“ 告诉机器结束询问,注意有个空格②printf不会刷新缓冲区,询问需要使用endl
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <stack>
#include <deque>
#include <queue>
#include <cmath>
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
typedef unsigned long long ull;
const int INF = 0x3f3f3f3f;
const int N = 1e4 + 10, M = 1e6 + 10;
const int base = 1e9;
const int P = 131;
const int MAX = 1e5;
int n, m, t;
int a[N];
int main()
{
scanf("%d", &n);
int k = 1;
for (int i = 2; i <= n; ++i)
{
int p, q;
//printf("? %d %d\n", k, i);
cout << "? " << k << " " << i << endl;
scanf("%d", &q);
//printf("? %d %d\n", i, k);
cout << "? " << i << " " << k << endl; //endl刷新缓冲区
scanf("%d", &p);
if (q < p)
a[i] = p; //p大,a[i]小
else
a[k] = q, k = i; //q大,a[k]小,将a[i]变为a[k]
}
a[k] = n; //最后留下的k一定是最大值n
printf("!");
for (int i = 1; i <= n; i++)
printf(" %d", a[i]);
printf("\n");
return 0;
}