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

博客探讨了Codeforces Round #669的C. Chocolate Bunny题目,详细解释了如何在最多2n次询问内猜出长度为n的排列顺序。内容包括题目描述、分析和解题代码,重点在于利用取模运算的性质进行询问策略的设计。
摘要由CSDN通过智能技术生成

C. Chocolate Bunny

题目链接

题目描述

给一个长度为 n n n的排列 p n p_n pn,由从 1 1 1 n n n的整数组成。要求通过询问猜出排列的顺寻,有最多 2 n 2n 2n次询问机会。
询问方式如下: " ? x y " ( 1 ≤ x , y ≤ n , x ≠ y ) "?\quad x \quad y"(1\leq x,y\leq n,x\neq y) "?xy"(1x,yn,x=y)系统将会返回 p x m o d   p y p_xmod\ p_y pxmod py的值。

题目分析

细节问题暂不讨论,主要讨论如何询问:
对于两个不相等的正整数 x x x y y y,假如 x > y x\gt y x>y x   m o d   y x\ mod\ y x mod y得到的一定是小于 y y y的数,而 y   m o d   x y\ mod\ x y mod x得到的则是 y y y本身。
如果令 a = x   m o d   y a = x \ mod \ y a=x mod y b = y   m o d   x b = y \ mod \ x b=y mod x,那么 x > y x\gt y x>y时, { a < y b = y ⇒ a < b \begin{cases}a\lt y\\b=y\end{cases}\Rightarrow a\lt b {a<yb=ya<b
通过 a < b a \lt b a<b也可推出 a < y , b = y , x > y a \lt y,b=y,x>y a<y,b=y,x>y x < y x\lt y x<y时同理。
因此可以通过比较两个数互相取模的结果来猜出其中一个数。

代码

#include <iostream>
#include <cstdio>

using namespace std;

int ans[10001];

int query(int x, int y) {
    printf("? %d %d\n", x, y);
    fflush(stdout);
    int respond;
    scanf("%d", &respond);
    return respond;
}

int main() {
    int n;
    cin >> n;
    int p = 1, a, b;
    for (int i = 2; i <= n; i++) {
        a = query(p, i);
        b = query(i, p);
        if (a > b) {
            ans[p] = a;
            p = i;
        } else { // a < b
            ans[i] = b;
        }
    }
    // 前面只填上了 1 到 n - 1,还剩 n 未填,而 p 最后即代表最大数 n 的位置
    ans[p] = n; 
    printf("!");
    for (int i = 1; i <= n; i++)
        printf(" %d", ans[i]);

    system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值