woj1419 无聊的游戏

Posted water_forever_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了woj1419 无聊的游戏相关的知识,希望对你有一定的参考价值。

Description xay和amr是两个很无聊的人,现在他两又在玩无聊的游戏。两个人拥有一摞特殊的牌,每张牌上只有一个正整数。现在两人轮流从牌里按顺序翻出一张放在桌上,如果其中一个人翻出的牌上的数字正好与桌上的另一张牌上的数字相同,那么他将获得并拿走这两张牌之间的所有牌(同时也包括这两张)。现在已知这一摞牌的顺序,你知道最终谁获得的牌更多而获胜吗?假设每次游戏由xay先翻牌,如果出现平局则算后翻牌的amr获胜。  
例如N=4,牌的顺序为3,10,5,10。首先xay翻到3,然后amr翻到10,xay翻到5,amr翻到10,则amr将获得牌面为10、5、10的3张牌。  
Input 输入包含多组测试数据。第一行包含一个整数T表示测试数据个数。
对于每个测试数据,第一行包含一个整数N(N<=100),表示牌的数量。第二行包含N个整数,按照顺序分别为每张牌上的整数。
Output 对于每组测试数据输出一行。
如果xay获胜则输出"xay"(不含引号,下同),否则输出"amr"。
Sample Input 2
3
1 2 2
4
3 10 5 10
Sample Output xay
amr

如上述描述的,题目不复杂,按照自己的笨拙的思路来说,对输入的数据数组操作,也觉得很复杂,因为要统计重复出现的次数,还得考虑哪个先出现。所以一开始就搁置了。

但是听说了这样的一种思路,将输入数据的位置存到以输入数据为下标的数组中,就可以很简单的判断,然后计数。不过,这个前提是输入数据不是很大,这道题经测试,输入数据时十万数量级的。例如输入1,2,2,1,我们有a[0]=1,a[1]=2,a[2]=2,a[3]=1;flag[a[0]]=0,flag[a[1]]=1,flag[a[2]]=2,flag[a[3]]=3,当发现某个flag已经存有数据时,证明,有重复了。这时再统计数量。我们知道统计之后,这些数据不能作为下次统计。所以统计时,加以判断,如果a[i]不是-1(-1是删除数据后,赋值的),再计数,否则不计数。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#define MAX 100000

int flag[MAX],num[101];;

int main(void)
	int n,t,i,j,k;
	int countx,counta,count;
	scanf("%d",&t);
	while(t--)
 	  scanf("%d",&n);
 	  if(n>1)
		for(i=0;i<MAX;i++)
 	         flag[i]=-1;
        j=0;
        countx=0;
        counta=0;
		for(i=0;i<n;i++)
		     scanf("%d",&num[i]);			 
			 if(flag[num[i]]!=-1)
		            count=0;
					for(k=flag[num[i]];k<=i;k++)
		                 if(num[k]!=-1)
		                       count++;
		  	        if(i%2==0)
	        		     countx +=count;
					else
						 counta +=count;
					for(k=flag[num[i]];k<=i;k++)
		                 num[k]=-1;
					
			 else
			 	 	flag[num[i]]=i;			       					 
			 
        if(countx>counta)
			 printf("xay\\n");
	    else
	    	 printf("amr\\n");
	   
	
	system("pause\\n");
	return 0;		   
	

哈哈,写的很粗糙,因为是第一次用这样的方法,处理程序,觉得很方便,很简洁,所以想记录一下。

以上是关于woj1419 无聊的游戏的主要内容,如果未能解决你的问题,请参考以下文章

井字游戏循环在平局时停止 - Java

iOS 游戏中心排行榜不允许平局?

woj1019 Curriculum Schedule 输入输出

WOJ -1204

[WOJ1583]向右看齐

WOJ1109 奶牛排队