2024/3/15

C. Chocolate Bunny

原题链接:Problem - 1407C - Codeforces

题目大意:

交互题目,要求通过2*n次以内的询问,猜出全排列。每次询问你给出i,j。他会返回pi mod pj

题目做法:

不难发现通过pi mod pj和pj mod pi,因为pi和pj当中肯定有个较大值,较小值mod较大值出来的是较小值,较大值mod较小值出来的是比较小值还小的值,所以一对必然可以确认一个。

AC代码:

#include<bits/stdc++.h>
#define pb(element) push_back(element)
#define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
using namespace std;
const int maxn=1e5+100;
void solve()
{
    int n,inips=1;
    cin>>n;
    set<int> ps;
    set<int> num;
    int res[n+10];
    for(int i=1;i<=n;i++) ps.insert(i),num.insert(i),res[i]=0;
    while(ps.size()!=1)
    {
        auto i=*ps.begin(),j=*ps.rbegin();
        int t1,t2;
        cout<<"?"<<" "<<i<<" "<<j<<'\n';
        cout.flush();
        cin>>t1;
        cout<<"?"<<" "<<j<<" "<<i<<'\n';
        cout.flush();
        cin>>t2;
        if(t1>t2)
        {
            res[i]=t1;
            ps.erase(ps.begin());
            num.erase(t1);
        }
        else
        {
            res[j]=t2;
            ps.erase((--ps.end()));
            num.erase(t2);
        }
    }
    cout<<"! ";
    for(int i=1;i<=n;i++)
    {
        if(res[i]!=0) cout<<res[i]<<" ";
        else cout<<*num.begin()<<" ";
    }
}
signed main()
{
    fast int casen=1;
    //cin>>casen;
    while(casen--) solve();
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值