【題解】 洛谷 P2649 遊戲預言

題目:

P2649 遊戲預言ios

題意:

John和他的好朋友們在van紙牌遊戲。共有$m$我的。紙牌有$n \times m$張,從$1……n \times m$編號。每人有$n$張。每人一回合出一張牌,編號最大的獲勝。因爲輸了有蜜汁懲罰,John想盡量地多贏。(欲知後事如何,且聽下回分解。。。code

思路:

題目問的是John最少贏多少次。咱們能夠設想:John十分美味多汁。他的好朋友們都想讓他接受蜜汁懲罰因此合夥坑John。這樣咱們能夠將不是John的牌放到一堆。每當John出一張牌就先出一張比該牌大的且不是John的的牌。而後剩餘的$m-2$張牌就從小的挨着出。直到出夠$m-2$張。若是沒有比John的牌大的John必贏遊戲

$Code$

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#define rr register
int ans,n,m,sum,jcard[51];
bool vis[1010],used[1010];

inline void read(int &T) {
    int x=0;bool f=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    T=f?-x:x;
}

int main() {
    read(m),read(n);
    for(rr int i=1,a;i<=n;++i) {
        read(a);
        vis[a]=1;
        jcard[++sum]=a;
    }
    for(rr int i=1;i<=sum;++i) {
        int num=m-1;
        int x=jcard[i];
        used[x]=1;
        for(rr int j=x+1;j<=n*m;++j) {
            if(!used[j]&&!vis[j]) {
                num--;
                used[j]=1;
                break;
            }
        }
        if(num==m-1) ans++;
        for(int j=1;num>0;++j) {
            if(!used[j]&&!vis[j]) {
                num--;
                used[j]=1;
            }
        }
    }
    std::cout<<ans<<'\n';
    return 0;
}

月考rp++get

相關文章
相關標籤/搜索