题目地址:
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.
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.
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);
}