链接:click here~~
题意:
有m个人,每个人有n张牌,牌点为在1~n*m中的不同的数。每回合每个人出一张牌,点数最大的那个人赢,给出A人初始时的n张牌的牌点,问A至少赢的次数。
【解题思路】 看做两个人互相出牌,注意出牌的顺序,你有m张牌,我有m*(n-1)张牌,每次我都出比你大一点的牌,如果没有,出最小的m张牌(可以忽略), 每次出最大的。如果别人手中最大的小于你的。得分+1,而对方则选择最小的一个扔掉。如果对方最大的大于你手中最大的,对方会选择自己手中最小但是比你最大的大的牌丢掉。也就是说,如果在我的排中找到最大点数的牌,就now++,否则别人就会把他的大牌拿出来跟我比,就now--,now最大的时候就是至少赢的次数。
代码:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int maxn=2005; int dp[maxn]; bool flag[maxn]; int n,m,t,i,j,s,num,ans; int main() { int tot=1; while(~scanf("%d%d",&n,&m)&&n&&m) { memset(flag,0,sizeof(flag)); for(i=0; i<m; i++) { scanf("%d",&dp[i]); flag[dp[i]]=1;//我手上没有的牌 } int maxx=0,now=0; for(i=n*m; i>0; i--) { if(flag[i]) { now++; if(now>maxx) maxx=now; } else now--; } printf("Case %d: ",tot++); printf("%d\n",maxx); } return 0; }
【贪心专题】POJ 1323 && HDU 1338 Game Prediction (贪心)
原文:http://blog.csdn.net/u013050857/article/details/44892617