HDU 1338 Game Prediction 小想法

题意:有n个人在玩牌,每个人手里面有m张牌,一共得n*m张牌标号从1到n*m,现在他们要玩很多轮游戏,每一轮赢的条件是:每个人从自己的牌组里面选择一张牌,然后所有人出最大牌的人赢得一轮,现在给你一个人的手牌,问你他最少赢几轮?


想法:有一个关键点,这里的最少赢,意思是,你这一把百分之一百会赢,那么这个人这一轮出的牌,一定是所有未出的牌里面最大的牌,因为每个人都想赢,所以只要你出了一张大的牌,那么他肯定会出比你大的牌。

注意:不要想到田忌赛马那一题,那个求得是理论最大赢得局数,这题是你可以稳赢的局数。


#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m;
int a[60],vis[1000+5];
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int ca=1;
	while(~scanf("%d%d",&n,&m),n+m)
	{
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=m;i++)
		{
			scanf("%d",&a[i]);
			vis[a[i]]=1;
		}
		sort(a+1,a+1+m,cmp);
		int key,sum=0;
		for(int i=n*m;i>=1;i--)
		{
			if(!vis[i])
			{
				key=i;
				break;
			}
		}
		for(int i=1;i<=m;i++)
		{
			if(a[i]>=key) 
			{
				sum++;
			}
			else
			{
				vis[key]=1;	
			}
			for(int j=n*m;j>=1;j--)
			{
				if(!vis[j])
				{
					key=j;
					break;
				}
			}
		}
		printf("Case %d: %d\n",ca++,sum);
	}
	return 0;
}

你可能感兴趣的:(HDU 1338 Game Prediction 小想法)