zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    免登陆 安全密钥验证
    第五节
    selinux
    scp
    Linux网卡绑定
    HDFS
    搭建软件仓库
    命名空间“System.Web”中不存在类型或命名空间名称“Optimization”(是否缺少程序集引用?)
    delphi利用指针,结构或component存储数据表数据
    Delphi中的ObjectList简单用法一则
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294291.html
Copyright © 2011-2022 走看看