codeforces B Lost Numbers

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值