第二周---贪心题解(N)

题N:
Suppose there are M people, including you, playing a special card game. At the beginning, each player receives N cards. The pip of a card is a positive integer which is at most N*M. And there are no two cards with the same pip. During a round, each player chooses one card to compare with others. The player whose card with the biggest pip wins the round, and then the next round begins. After N rounds, when all the cards of each player have been chosen, the player who has won the most rounds is the winner of the game.

Given your cards received at the beginning, write a program to tell the maximal number of rounds that you may at least win during the whole game.
Input
The input consists of several test cases. The first line of each case contains two integers m (2?20) and n (1?50), representing the number of players and the number of cards each player receives at the beginning of the game, respectively. This followed by a line with n positive integers, representing the pips of cards you received at the beginning. Then a blank line follows to separate the cases.

The input is terminated by a line with two zeros.
Output
For each test case, output a line consisting of the test case number followed by the number of rounds you will at least win during the game.

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

题意: 卡牌游戏,最大的牌为M*N,M为人数,N为每个人收到的卡牌数。每轮牌最大的人赢,问这个人最少赢几场。

思路:

  1. 要求是最少赢多少场,每轮胜者所用最大的牌赢。2.
  2. 例如第一组数据中,9和10肯定会赢,但是7如果碰到8就输了;如果8没有在10和9所赢场次中被消耗掉,那么他最多只能赢2场。
  3. 自然想到可以根据所得牌数大小进行降序排列。再将N*M遍历下来,过程中如果相等,则肯定赢一场,若不相等,要注意自己所出的最大牌被消耗掉,N乘M遍历下来的那个数也要消失,一下损失两个数
  4. 一个变量控制N*M每轮递减的值,一个变量控制自己手中的牌数。当手中的牌不等于该轮最大值时,令m=0累计加1,同时让自己手中的牌假设不参与下一轮,直到再次相等,m再递减1。直到m=0时才能继续赢

代码:

#include <iostream>
#include<cmath>
#include<algorithm>
#include<cstring>

int a[55];
bool cmp(int a,int b)
{
    return a>b;
}
using namespace std;
int main()
{
    int m,n;
    int b=1;
    while(cin>>m>>n&&m!=0&&n!=0)
    {
        memset(a,0,sizeof(0));
        int sum=0;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        int s=m*n;
        sort(a,a+n,cmp);
        int ans=0,g=0;
        for(int j=s;j>=1&&g<n;j--)
        {
            if(a[g]!=j) ans++;
            else
            {
                if(ans) ans--;
                else sum++;
                g++;
            }
        }
       cout<<"Case "<<b<<": "<<sum<<endl;
         b++;
    }
    return 0;
}

总结:
收获一种处理数据的方法。
适用情况:两组数都从大到小开始比较,参与比较的数都会被消耗掉

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值