传送门: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);
}
}
}