题意:一个交互题,具体是,一个大小为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]<<' ';
}
}