Codeforces Round #669 (Div. 2)/1407C Chocolate Bunny

题目链接: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;
}
posted @ 2020-11-27 21:07  xiaopangpang7  阅读(98)  评论(0编辑  收藏  举报