欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

codeforces B Lost Numbers

程序员文章站 2022-05-09 16:18:27
...

题目连接: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,所以可以直接暴力全排列得出结果。