看到大家学习算法这么努力,wqd决定给大家发红包。 没错,王老板是个很有钱的人。
王老板给n个人发牌,每个人有m张牌,于是就有n x m张牌(每张牌都有一个值,介于1到n*m之间,不重复),然后进行m轮游戏,每轮每个人都出一张牌,牌最大的那个人就赢了这一轮,王老板就会给他一个红包
现在有同学拿到了一组牌,他想知道他至少能得到多少个王老板的红包,你能帮帮他吗?
Input
输入包括几个测试用例。每个样例两行
第一行包含两个整数m(2-20)和n(1~50),分别表示游戏者的数量和每个玩家在游戏开始时接收的牌的数量。 第二行有n个正整数,表示在开始时收到的牌的点数。
输入m,n为0时结束。
Output
对于每个测试用例,输出一行
包含测试用例编号,和至少获得的红包数 。
具体格式见样例。
Sample Input
2 5
1 7 2 10 9
6 11
62 63 54 66 65 61 57 56 50 53 48
0 0
Sample Output
Case 1: 2
Case 2: 4
Hint
当我打出的那张牌是全场最大的一张牌时,我一定能够获胜这一轮
题目大意:给出m和n,表示参加游戏的人数和每个人手中牌的个数,第二行给出的是自己的手牌,求至少能获胜几轮。
解题思路:这道题用到贪心的思想,我们开一个数组a来表示m x n张牌的状态,如果手中有下标为 i 的牌,则a[i]为true,如果没有则为false,先读入数组,然后从最大的牌(m*n)开始遍历,一直到1(最小的牌)停止,用一个cnt来记录场上当前比我们牌的点数大的数量,如果cnt为0并且我们手中有这张牌,则说明我们是最大的了,ans++,如果cnt不为0但是我们手中有这张牌,则cnt–,如果我们手中没有这张牌,则cnt++,最后输出ans即可。AC代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int _max=1e3+50;
bool a[_max];
int main()
{
int n,m,s=1;
while(cin>>n>>m)
{
if(n==0||m==0)
break;
memset(a,false,sizeof a);
for(int i=0;i<m;i++)//初始化数组
{
int num;
cin>>num;
a[num]=true;
}
int cnt=0,ans=0;
for(int i=n*m;i>=1;i--)
{
if(a[i]&&!cnt)
ans++;
else if(a[i])
cnt--;
else
cnt++;
}
printf("Case %d: %d
",s++,ans);
}
//system("pause");
return 0;
}