POJ 1323

传送门:http://poj.org/problem?id=1323

题目大意:N个人打牌,每个人M张牌,牌最大为n*m,最小为1,每个人手中的牌大小都不一样,给你m张牌,问最多能赢几场。

简单的贪心,看外面最大的牌比自己手中最大的牌多多少张,当牌数为10,9,7,2,1时,外面最大只有8,所以10,9必定能赢,剩下手中最大为7,不一定赢。
代码:

#include<iostream>
#include<algorithm>
#include<functional>
#include<cstdio>
using namespace std;
int main()
{
	int a[10000];
	int n,m,t=1,flag,sum,num;
	while(cin>>n>>m&&(m+n))
	{
		sum=0;
		for(int i=0; i<m; i++)
			cin>>a[i];
		sort(a,a+m,greater<int>());
		int maxn=n*m;
		if(maxn-a[0]>=n)
		{
			printf("Case %d: %d\n",t++,sum);
			continue;
		}
		else
		{
			flag=maxn-a[0],num=1;
			for(int j=0; j<m; j++)
			{
				if(a[j]-1==a[j+1])
				{
					++num;
					continue;
				}
				else
				{
					if(num>flag)
					{
						sum+=num-flag;
						flag=a[j]-a[j+1]-1;
						num=1;
					}
					else
					{
						flag-=num;
						flag+=a[j]-a[j+1]-1;
						num=1;
					}
				}
			}
			printf("Case %d: %d\n",t++,sum);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值