解题报告(poj1323)
题意:
n个人在玩牌,每个人有m张牌,于是就有n*m张牌(每张牌都有一个值,介于1到n*m之间,不重复),然后进行m轮游戏,每轮每个人都出一张牌,牌最大的那个人就赢了,然后给出n和m,以及你的m张牌,问你最多能赢几轮?
样例:
6 11
62 63 54 66 65 61 57 56 50 53 48
先排序,得:
66 65 63 62 61 57 56 54 53 50 48
n*m=66,所以66和65必赢,而能赢61,62,63的只有64(61,62,63中一定有两张牌赢)
于是可以使用一个变量dmt来计算对方可以赢自己的牌的数量(如果这个变量不为0,则说明自己不能赢)。
创建变量n,表示排序后第一张未打出牌的下标
从n*m循环到1,检查每张牌,
如果拥有此牌,且dmt为0(对方没有可以赢自己的牌)ans++,n++(已经打出了这张牌)
如果拥有此牌,且dmt不为0,则n++(打出一张牌),dmt–(对方打出一张牌)
如果没有此牌,dmt++
最后输出ans即可
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b){
return a>b;
}
int main(){
int tot=0;
int m,n;
while(true){
int a[66];
int dmt=0,ans=0,n=1;
cin>>m>>n;
if(m==0&&n==0)return 0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n,cmp);
for(int i=n*m;i>=1;i--){
if(i==a[n]){
n++;
if(dmt==0){
ans++;
}else{
dmt--;
}
}else{
dmt++;
}
}
tot++;
printf("Case %d: %d\n",tot,ans);
}
return 0;
}
20:45 2018/6/28