hdu 1338 Game Prediction

题目地址:

http://acm.hdu.edu.cn/showproblem.php?pid=1338

题目描述:

Game Prediction

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 803    Accepted Submission(s): 440


Problem Description
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 <= m <= 20) and n (1 <= n <= 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张牌,牌的点数从1到m*n,问一个人至少能赢多少局。

题解:

排序贪心。由于说了是至少,那么说明其他n-1个对手是足够聪明的,不会因为疏忽而让你赢了本不该让你赢的局,只有实在没办法的局,才是你至少赢的局。
那么什么是实在没办法的局??必定是我手里的一张牌比其他人手里的任何一牌都大。
所以策略是这样的,每次我都出我自己手里最大的牌,如果符合上面那个条件那么这局就是至少赢的局,反之就是对手赢的局。这里把m-1个对手合体成一个对手,他们的任务就是不让我赢。一旦我出不是最大的牌,他们只要一个人出一个比我稍大的牌,其他人都出小牌(只要能让我不赢就行)就行。下次再换另一个对手出大牌来压制我,所以实际上是可以把m-1个对手合体的。
代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int m=0,n=0;
int map_num[1000+5]={0};//1 is used  0 is not used for opposite
int my_num[100]={0};
int cases=0;
bool comp(int a,int b) {return(a>b);}
int main()
{
    while(scanf("%d%d",&m,&n)!=EOF&&(m+n)>0)
    {
        memset(map_num,0,sizeof(map_num));
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&my_num[i-1]);
            map_num[my_num[i-1]]=1;
        }
        sort(my_num,my_num+n,comp);
        for(int i=0;i<=n-1;i++)
        {
            int j=0;
            for(j=my_num[i]+1;j<=n*m;j++)
            {
                if(!map_num[j])
                {
                    map_num[j]=1;
                    break;
                }
            }
            if(j>n*m) cnt++;
        }
        printf("Case %d: %d\n",++cases,cnt);
    }
    return(0);
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值