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;		   
	}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值