猜数游戏
猜数游戏
Problem Description
猜数游戏在XXX国非常流行
游戏过程大概是这样的……
一个裁判,三个路人,路人足够聪明\\你可以认为路人是petr,acrush,tourist之类的生物……
每次裁判会选出三个正整数,其中某两个相加等于第三个
然后分别把这数写在三个路人的脸上 \\--||| 不要在意这下细节
也就是说,每个路人都知道另外两个路人的数字但不知道自己脸上的数是什么
游戏开始,裁判每一轮都会问他们三个能否猜出自己脸上是什么,为了体现游戏的公正性,路人们必须同时给出回答。
直到有一个路人猜出自己的数时游戏停止
那么,如果告诉你这三个数a,b,c,为了证明你比路人厉害,你能预测出游戏会在第几轮停止吗?
游戏过程大概是这样的……
一个裁判,三个路人,路人足够聪明\\你可以认为路人是petr,acrush,tourist之类的生物……
每次裁判会选出三个正整数,其中某两个相加等于第三个
然后分别把这数写在三个路人的脸上 \\--||| 不要在意这下细节
也就是说,每个路人都知道另外两个路人的数字但不知道自己脸上的数是什么
游戏开始,裁判每一轮都会问他们三个能否猜出自己脸上是什么,为了体现游戏的公正性,路人们必须同时给出回答。
直到有一个路人猜出自己的数时游戏停止
那么,如果告诉你这三个数a,b,c,为了证明你比路人厉害,你能预测出游戏会在第几轮停止吗?
Input
每行三个正整数a,b,c,(1<=a,b,c<=200) \\保证其中一个是另外两个的和以0 0 0结束.
Output
输出一个数,表示游戏在第几轮结束 \\从1开始计数
Sample Input
1 1 2 1 2 3 3 2 1 0 0 0
Sample Output
1 2 2
解释:
这个题目我是真的不会,没有看解析之间是真的不会,解析看了好久才会,我真的废物啊,很废,就是一个LJ。
猜数字这个游戏,一般人玩不来。
分析一下,首先假设大家都是聪明人,并且可以很快的知道,编号a, b, c。如果有两个数字是相同的,那么只要一次,就可以确定。当a + b == c 的时候,并且a == b.
那么c 就可以一次猜出来。 通过一系列的证明,都头上数字最大的人,是最快猜出来的,一波数学证明,我没有学会,但是当a==b的时候,也只有两个数相同的时候,第三个人才可以猜出来,所以,我就是觉得数字最大的是,最容易猜出来的。数字最大的那个人,看到的就是较小的两个数,于是就是可以分析,这两个小的数。假设现在是 3 7 10,对应的是a, b, c. c开始分析,第一遍的时候,大家都说,不知道,那么就不存在有人第一遍就可以确定自己的数字是两个数字的和还是差,也可以确定没有人看到的数字是两个相同的。那么这样的话,那么C就可以觉得B可能认为C是自己的数字减去A的数字,对应的就是4。但是他不确定。第二遍的时候,C假设自己是4,但是还是不确定,此时,大家又回答都不知道,所以C就可能觉得B可能认为C觉得自己可能是4,那么就猜自己是1。大家都会往自己猜想的数字和现在最佳的数字,进行相减,应该只有这样,每次回答之后,就会有一次猜想有两个数相同,然后逆推就可以知道自己的数字。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int find(int x, int y){ 6 if(x == 0 || y == 0) return 0; 7 if(x < y) swap(x, y); 8 return x / y + find(x % y, y); 9 } 10 11 int main() 12 { 13 int a, b, c; 14 while(cin >> a >> b >> c){ 15 if(!(a+b+c))break; 16 if(a > c) swap(a, c); 17 if(b > c) swap(b, c); 18 cout << find(a, b) << endl; 19 } 20 return 0; 21 }
我可能说的不够详细,可以参考《算法艺术与信息学竞赛(刘汝佳、黄亮 着)》里面有介绍,下载链接:https://share.weiyun.com/5Pxbve6