Game Prediction(贪心)
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张牌,最大的牌为n*m, 每人每轮出一张 点数最大的获胜 求至少获胜的次数
思路: 题求能赢的最大次数,意味着我们要求的是必胜的次数,当场上有人拿比你这次出的牌更大的牌的时候,你是必输的。如果我们的牌为全场最大,则对手应出他最小的牌,如果我们的牌不是最大的,我们应出我们最大的牌 这样求出来的才是必胜次数,有点类似于田忌赛马
AC代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int a[1100],b[1100],book[1100];
int main()
{
int c=1,n,m;
while(~scanf("%d%d",&n,&m))
{
int i,j=0;
if(m==0&&n==0)
break;
memset(book,0,sizeof(book));
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
book[a[i]]=1;//标记我们手中的牌
}
for(i=n*m;i>=1;i--)
{
if(book[i]==0)
b[j++]=i;//求出剩余最大的牌,作为对手的牌
if(j==m)//这里我们相当于把m个人的游戏看成两个人的游戏
break;
}
sort(a,a+m);
int s=0,k=0;
for(i=m-1;i>=0;i--)//大与大的比
{
if(b[k]>a[i])
k++;
else//我们牌大必赢
s++;
}
printf("Case %d: %d\n",c++,s);
}
return 0;
}