这题我用的是贪心算法,我的理解是这样的:
要求我最少能赢的次数,就是求别人最多能赢的次数。首先把我的牌先升序排序,然后我从小开始出,对于我出的牌,别人应该尽可能的压,而且用他们比我大的最小的那张牌;如果他们不压,那么他们后面这张牌就很有可能用不上,就少赢一次。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<stack> #include<queue> using namespace std; int card[52]; bool used[1002]; int n,m,t; int _find(int x) { for(int i=x+1;i<=t;i++) if(!used[i]) return i; return 0; } int main() { int k=1; while(scanf("%d%d",&m,&n)) { if(n==0&&m==0) break; memset(used,false,sizeof(used)); for(int i=1;i<=n;i++) { scanf("%d",&card[i]); used[card[i]]=true; } sort(card+1,card+n+1); t=n*m; int ans=0; for(int i=1;i<=n;i++) { int a=_find(card[i]); //printf("card=%d,a=%d\n",card[i],a); if(a!=0) used[a]=true; else { ans+=n-i+1; break; } } printf("Case %d: %d\n",k++,ans); } return 0; }
时间: 2024-10-18 06:16:43