POJ 1323 Game Prediction

题意:有n个人和n*m张牌,每一轮出牌最大的人赢,现告诉你某一个人的牌,判断他至少能赢几局
解题方法:贪心
解题思路:先将牌的序列降序排列,再定义两个变量count和maxx。从最大的序号n*m开始遍历,若牌序列中无这张牌,maxx++。若牌序号中有这张牌,判断maxx是否为0,若是,count++,表示赢一局,否则,maxx--。

代码: 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1010;
int card[maxn];
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	int n,m,ca=0;
	while(~scanf("%d%d",&m,&n)&&m&&n)
	{
		memset(card,0,sizeof(card));
		for(int i=0;i<n;i++)
		scanf("%d",&card[i]);
		sort(card,card+n,cmp);//降序排序 
		int count=0,maxx=0;//count记录能赢的局数,maxx记录之前有多少牌比这个人手上的大 
		for(int i=m*n,j=0;i>0;i--)
		{
			if(i==card[j]&&!maxx)//此时这个人手上为最大牌 
			{
				count++;
				j++;
			}
			else if(i==card[j]&&maxx)//之前有牌比它大 
			{
				j++;
				maxx--;//让这张大一些的牌出去 
			}
			else//该牌比他手上的牌大 
			maxx++;
		}
		ca++;
		printf("Case %d: %d\n",ca,count);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41279172/article/details/80497574