ZOJ1003 Crashing Balloon

 

 题目地址: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

你可能感兴趣的:(游戏)