碰撞气球
时间限制:2秒内存限制:65536 KB
每年6月1日的儿童节,都会有一个名为“爆气球”的电视节目。这个规则很简单。地面上有100个标有气球的气球,号码是1到100。裁判员喊道:“走吧!”这两名选手每人以1分开始比赛,用脚撞倒气球,同时把他们的分数乘以写在气球上的数字。一分钟后,小观众就可以把剩下的气球拿走,每个参赛者都会报告他自己的得分,即他坠毁的气球上的数字。非正式的赢家是宣布最高得分的球员。
然而,不可避免地会出现争端,因此官方胜利者在争端解决之前还没有确定。声称得分较低的球员有权挑战对手的得分。得分较低的球员被认为是在说实话,因为如果他对自己的分数撒谎,他肯定会想出一个更好的谎言。如果得分较高的球员得分不高,气球不能被富有挑战性的球员击倒,这将是一个挑战。因此,如果挑战成功,声称较低分数的玩家获胜。
因此,例如,如果一名球员要求343分,而另一名球员要求49,那么显然第一名球员在撒谎;得分343的唯一方法是击落标记为7和49的气球,而得分49的唯一方法是击落一个标有49的气球。由于两个分数中的每一个都要求将气球标记为49,所以要求343个点的气球被认为是在说谎。
另一方面,如果一名球员要求162分,而另一方要求81,则双方都有可能说出真相(例如,一次撞球2, 3和27,而另一次撞倒气球81),因此挑战不会得到支持。
顺便说一下,如果挑战者在计算他/她的分数上犯了一个错误,那么这个挑战就不会得到支持。例如,如果一名球员要求10001分,而另一方要求10003,那么显然他们都没有说实话。在这种情况下,挑战不会得到支持。
不幸的是,任何一个愿意在球风中比赛的人都可能会在他无法合理地完成裁判所要求的复杂计算的激烈气氛中兴奋不已。因此,你需要清醒的程序员,提供一个软件解决方案。
输入
一对不相等的正数,每对在一条线上,声称是从一个碰撞气球中得到的分数。
产量
数字,一条线,一条线,这是获胜的分数,假设得分较低的球员总是挑战结果。
样本输入
343 49
3599 610
62 36
样本输出
四十九
六百一十
六十二
资料来源:浙江大学地方竞赛2001
代码如下:
#include<stdio.h>
int at,bt;
int juge(int m,int n,int p)
{
if(m==1&&n==1)
{
at=1;
return 0;
}
if(n==1)
bt=1;//此处实现若俩数有一人撒谎,则数字小的人获胜
while(p>1)
{
if(m%p==0)juge(m/p,n,p-1);//即使m=1也没关系,因为大的数字即使除到1也不会对at和bt发生改变,除非出现m=1且n=1
if(n%p==0)juge(m,n/p,p-1);
p--;
}
return 0;
}
int main()
{
int a,b,t;
while(scanf("%d%d",&a,&b)!=EOF)//此处若不加!=EOF会出现时间超时
{
at=0;
bt=0;
if(a<b)//a储存大的数字
{
t=a;
a=b;
b=t;
}
juge(a,b,100);
if(at!=1&&bt==1)
printf("%d\n",b);
else
printf("%d\n",a);
}
return 0;
}
本文介绍了一款名为“碰撞气球”的游戏,两名参赛者通过踩踏气球获得分数,并根据分数判断谁在说真话。文章详细解析了判断真伪的逻辑,包括通过质因数分解验证分数的方法。
3911

被折叠的 条评论
为什么被折叠?



