B. Lost Numbers(补题)

题意:一个交互题,具体是,一个大小为6,由4 8 15 16 23 42组成的一个排列,你每次询问两个数的下标,程序会给你他们两个的乘积,交互的过程为4次,问这个排列的顺序是怎样的。

思路:因为任意两数之积都是唯一的不重复的,我们两次询问就可以求出三个数,比如, 1 2 和2 3 ,我们通过值用map表示出这个值是由哪两个数相乘得到的,然后这四个数重复的就是2,然后求出1,3 代表的数字

代码:

#include<bits/stdc++.h>
using namespace std;
int s[6]={4,8,15,16,23,42};
int main(){
    vector<int>ans;
    vector<pair<int,int>>q(4);
    vector<int>g(4);
    q[0]={1,2};
    q[1]={2,3};
    q[2]={4,5};
    q[3]={5,6};

    int k=4;
    for (int i = 0; i <4 ; ++i) {
        ::printf("? %d %d",q[i].first,q[i].second);
        cout<<endl;
        ::fflush(stdout);
        cin>>g[i];
    }
    map<int,pair<int,int>>mp;
    for (int i = 0; i <6 ; ++i) {
        for (int j = i+1; j <6 ; ++j) {
            mp[s[i]*s[j]]={s[i],s[j]};
        }
    }
    cout<<"! ";
    int a=g[0],b=g[1];
    vector<int>pp;
    pp.push_back(mp[a].first);
    pp.push_back(mp[a].second);
    pp.push_back(mp[b].first);
    pp.push_back(mp[b].second);
    sort(pp.begin(),pp.end());
    int wz;
    for (int i = 0; i <3 ; ++i) {
        if(pp[i]==pp[i+1]){
            wz=i;
        }
    }
    int two=pp[wz];
    int one=g[0]/two;
    int three=g[1]/two;

    ans.push_back(one);
    ans.push_back(two);
    ans.push_back(three);

     a=g[2],b=g[3];
    vector<int>gg;
    gg.push_back(mp[a].first);
    gg.push_back(mp[a].second);
    gg.push_back(mp[b].first);
    gg.push_back(mp[b].second);
    sort(gg.begin(),gg.end());
     wz;
    for (int i = 0; i <3 ; ++i) {
        if(gg[i]==gg[i+1]){
            wz=i;
            break;
        }
    }
    int five=gg[wz];
    int four=g[2]/five;
    int six=g[3]/five;
    ans.push_back(four);
    ans.push_back(five);
    ans.push_back(six);
    for (int i = 0; i <ans.size() ; ++i) {
        cout<<ans[i]<<' ';
    }

}
posted on 2023-07-17 19:39  IR101  阅读(6)  评论(0编辑  收藏  举报  来源