POJ 1323-Game Prediction(贪心)

看到大家学习算法这么努力,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;
}
原文地址:https://www.cnblogs.com/Hayasaka/p/14294291.html