ZOJ1003 Crashing Balloon

该博客介绍了一个游戏得分验证问题,其中低分玩家得分真实,而高分玩家可能撒谎。通过检查两个得分是否有共同因子来判断是否存在矛盾。例如,343和49不可能同时存在,因为343只能由49和7构成,而49只能由自身构成。通过深度优先搜索检查所有可能的因子组合,确定是否有人说谎。如果低分玩家质疑成功,他们赢得比赛;否则,高分玩家获胜。
摘要由CSDN通过智能技术生成

Crashing Balloon

现有编号为1-100的气球,在游戏中每个人的得分是他踩破气球的数字的乘积,但并不是每个人都会如实计算自己的得分(可能为了赢,报更高的分数)。已知低分的人不能说谎,高分的人可能说谎,低分的人可以质疑高分的人,如果质疑成功(高分的人确实说谎了),那么低分的人赢得比赛,否则高分的人赢得比赛。
e.g 343和49,343只能由49*7得来,49只能由49得来,这两个分数是不可能同时存在的,故高分的人说谎了,低分的人赢得比赛。

思路:
看两个数有没有 [ 1 , 100 ] [1,100] [1,100]内的重复的因子
dfs两个数字的因子,如果两个数都能变为1,则无人说谎(没有重复因子)

 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
typedef long long ll;
int f1,f2;
void dfs(int a,int b,int k){
	if(f1) return;//高分的人没有说谎,则直接高分的人赢
	if(a==1&&b==1){
		f1=1,f2=1;
		return;
	}
	if(a!=1&&b==1){
		f2=1;//不能return,继续搜,a还有可能变为1 
	}
	if(k<1) return;
	if(a%k==0) dfs(a/k,b,k-1);因子k,被a用不被b用
	if(b%k==0) dfs(a,b/k,k-1);因子k,被b用不被a用
	dfs(a,b,k-1);//因子k,既不被a用又不被b用
}
int main(){
	int x,y;
	while(cin>>x>>y){
		if(x<y) swap(x,y);
		f1=0,f2=0;
		dfs(x,y,100);
		if(!f1&&f2) cout<<y<<endl;
		else cout<<x<<endl;
	}
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值