题意:有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;
}