• 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;
    }
    
  • 相关阅读:
    display:inline-block 什么时候不会显示间隙?
    js数组算法题01
    redux中的reducer为什么必须(最好)是纯函数
    如何实现 token 加密
    已知如下代码,如何修改才能让图片宽度为 300px ?注意下面代码不可修改。
    分析比较 opacity: 0、visibility: hidden、display: none 优劣和适用场景
    Vue 的响应式原理中 Object.defineProperty 有什么缺陷?
    JAVA课程实验报告 实验二 Java面向对象程序设计
    Java课程实验报告 实验一 Java开发环境的熟悉
    [题解] Luogu P5641 【CSGRound2】开拓者的卓识
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294291.html
Copyright © 2020-2023  润新知