题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1003
|
题目大意: 6.1节两人踩气球游戏,有100个气球标记从1~100。游戏开始后,两个同学开始时分数都为1,开始游戏后就去采那些气球,每当踩下一个气球,每个人的分数在原来的基础之上乘上刚踩到的气球的标记号。 比赛结束后,每个人报上自己的分数。裁判预先设置分数最高的获胜。然后再次对分数进行审核。如果两个同学的分数必须要求踩到同一个气球,那就是说两个人的分数发生了冲突,那么裁判将认定分数少的那个同学或胜。其它情况的话,结果不再改变。
解题思路: 获得输入后,我们可以检查两个分数是否相容。具体检测两分数相容的方法如下: i 从100到1,如果 i 被低分整除,那么说明i有可能被踩到了,然后低分除以 i ,接着从 i-1 往下找。如果不被整除,那就测试 i 是否被高分整除,如果被整除,那么高分除以 i ,继续从 i-1 往下找。 如果 i 等于时 1 时,低分数变成 1,那说明从1~100之间的数可能被它完全整除,也就是没有说慌。否则就认定她说了慌。 之后判断高分是否也可以分解,如果同样可以分解说明他们相容。 还有一种情况是,高分可以分解,但低分跟本不可能分解,说明低分数说慌了,于是分数也是相容的。 还是看源代码,这题我思路也是模糊的,讲不清
|
#include <iostream> #include <algorithm> using namespace std; //用于标记分数少的那个同学是否有可能达到她报的分数 bool flag; bool check(int big,int less,int n){ int i; for(i = n; i > 1; i--){ if(less % i == 0) if( check(big, less/i, i-1)) return true; if(big % i == 0){ if(check(big/i, less, i-1)) return true; } } if(less==1){//如果分数少的同学有可能不说慌 flag=true; } else if(!flag){ //如果分数少的那个同学说慌了,那说明两个分数是相容的 return true; } if(big==1 && less==1){ //如果分数高的同学没有说慌,而且另一个同学也没有说慌,相容! return true; } //分数高的同学没有说慌,但分数少的同学说慌了,结果还是相容! if(big==1 && !flag) return true; return false; } int main(){ int a,b,win; while(cin>>a>>b){ if(a<b) swap(a,b); win = a; flag=false; //判断两位同学报的分数是否相容 if(!check(a,b,100)){ win = b; } cout<<win<<endl; } return 0; } |
Run Time(ms) Run Memory(KB) 20 188 |