题意
- pip - a mark on a playing card
- M个人,一开始每人分N张卡(卡的面值为最大N*M的正数,且面值各不相同)
每轮游戏,每位玩家选一张牌和其他玩家比较,牌面最大的玩家获得本轮胜利,开始下一轮
N轮结束后,获胜轮次最多的玩家赢得游戏
给出一开始分的卡的面值,求至少能获胜的几轮 - 输入:
m (2<=m<=20),n (1<=n<=50)
接着n个数字,表示牌的面值
每组数据用空行隔开 - 输出:
Case x: y
x为第几组数据,y为获胜的轮次
思路
对输入的数据做标记,然后划分两个数组:my_card[],others_card[],从大到小排序
遍历my_card[]:
① 如果my_card[i] > others_card[j](我手里最大的牌比别人最大的牌大),我必胜,i++(消耗掉这张牌),count++(获胜轮数+1)
② 如果我的手牌比别人最大的牌小,i++,j++(别人消耗掉这张牌)
直到我手里的牌用完,游戏结束,输出
代码
#include<cstdio>
#include<string.h>
using namespace std;
int my_card[51];
int others_card[1000];
int mark_card[1001];
int l_my = 0, l_others = 0;
int main(){
int m, n, temp;
int i, j, count, case_no = 1;
while(scanf("%d %d", &m, &n)!=EOF){
if(m==0 && n==0)
break;
l_my = 0;
l_others = 0;
count = 0;
memset(mark_card, 0, sizeof(mark_card));
for(i=0; i<n; i++){
scanf("%d", &temp);
getchar(); //吸收空格或回车
mark_card[temp] = 1;
}
getchar(); //吸收空行
for(i=m*n; i>0; i--){
if(mark_card[i])
my_card[l_my++] = i;
else
others_card[l_others++] = i;
}
i = 0;
j = 0;
for(; i<n; i++){
if(my_card[i]>others_card[j])
count++;
else
j++;
}
printf("Case %d: %d\n", case_no++, count);
}
return 0;
}