題目:
P2649 游戲預言
題意:
John和他的好朋基友們在van紙牌游戲,共有\(m\)個人,紙牌有\(n \times m\)張,從\(1……n \times m\)編號,每人有\(n\)張,每人一回合出一張牌,編號最大的獲勝,由于輸了有蜜汁懲罰,John想盡可能地多贏,(欲知后事如何,且聽下回分解,,,
思路:
題目問的是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++
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98148.html
標籤:C++
下一篇:KMP
