当前位置: 代码迷 >> 综合 >> codeforces B Lost Numbers
  详细解决方案

codeforces B Lost Numbers

热度:43   发布时间:2023-11-19 23:31:23.0

题目连接:https://codeforces.com/contest/1167/problem/B
题目大意:给你6个数,这6个数已经确定且互不相同,然后允许你问四次乘积(即询问i和j两个位置的乘积),通过这四次结果计算出这6个数的顺序。
题解思路:分别询问(1,2),(1,3),(1,4),(1,5)这四个结果。通过前两个结果,我们进行暴力求解,可以得到前三个数。然后根据这些结果就可以求出第四个、第五个数了。最后一个数用总和减去已经得到的数即可。
代码:

#include <bits/stdc++.h>
using namespace std;
int num[6] = {16,23,4,8,15,42};
int r;void ask(int i, int j){cout<<"? "<<i<<" "<<j<<endl;fflush(stdout);cin>>r;
}
int main(){ask(1,2);int a, b, c, d, e, f;for(int i = 0; i < 6; i++){for(int j = 0; j < i;j++){if(num[i] * num[j] == r){a = num[i];b = num[j];break;}}}ask(1,3);bool flag = false;for(int i = 0; i < 6; i++){if(num[i] != a && num[i]*a == r){flag = true;break;}}if(!flag){int temp = a; a = b; b = temp;}c = r / a;ask(1,4);d = r / a;ask(1,5);e = r / a;f = 108 - (a+b+c+d+e);cout<<"! "<<a<<" "<<b<<" ";cout<<c<<" "<<d<<" ";cout<<e<<" "<<f<<endl;
}

附:由于6! = 720,所以可以直接暴力全排列得出结果。

  相关解决方案