这道题能用贪心做出来,大概就是让你求他能出的至少能确保获得几轮的胜利,看了结题报告才弄懂题意的,好晦涩啊,
思路就是先降序排序,一个循环,从最大点数的牌开始,每次和玩家比较下~~
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=1000+100;
int cmp(const void *a,const void *b)
{
return (*(int*)b)-(*(int*)a);//降序
}
int a[maxn];
int main()
{
int n,m,kase=0;
while(scanf("%d%d",&n,&m)&&n&&m)
{
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
qsort(a,m,sizeof(int),cmp);
int cnt=0,flag=0;
for(int max1=n*m,i=0;max1>0&&i<m;max1--)
{
if(max1==a[i])
{
i++;//大牌开始出了
if(flag==0)
cnt++;
else
flag--;//此时本应该出的的大牌拿到前边去抵消输的牌了
}
else
{
flag++;//某局不能赢
}
}
printf("Case %d: %d\n",++kase,cnt);
}
}