poj1323题解报告

解题报告(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

猜你喜欢

转载自blog.csdn.net/qq_42570306/article/details/80941623
今日推荐