題目大意
有M個人,一人N張牌,每輪牌面最大的人贏(牌面只可能是1~M*N中的一個數且不重複),給出一個人的牌,求其至少能夠贏的局數。
解題思路
貪心
先sort一遍,給手裏的牌排下序
這道題有兩種情況
全場的最大值一開始maxx=n*m
題中說最少能贏的最大次數,意味着我們要求的是必勝的次數,當場上有人拿比你這次出的牌更大的牌的時候,你是必輸的。
所以我們按照從大到小開始出牌。。。出的牌要麼等於全場的最大值,要麼小於全場的最大值
一:如果我們有最大的牌a[i-1]=maxx,顯然我們必勝了,之後我們手上的牌最大的變成了原來次大的a[i-2],全場的最大值maxx–;
二:如果我們手中最大的牌小於其他人手中的牌,那麼我們必輸,且與此同時我們手上這張最大的牌和僅僅比它稍微大的那張牌作廢(因爲題目求的是我們至少贏的次數,所以其他人都是足夠聰明的,不會浪費大牌,其他人只需出一張大於我們的牌即可),這時的最大值maxx–
代碼如下
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e4;
int a[maxn];
int main()
{
int n,m,i,ans=0,maxx;
int t=0;
while(cin>>n>>m)
{
t++;
if(n==0&&m==0)
break;
ans=0;
maxx=n*m;
for(i=0;i<m;i++)
cin>>a[i];
sort(a,a+m);
for(i=m-1;i>=0;i--)
{
if(a[i]<maxx)
maxx-=2;
else if(a[i]==maxx)
{
ans++;
maxx--;
}
}
cout<<"Case "<<t<<": ";
cout<<ans<<endl;
}
return 0;
}