POJ1323

題目鏈接

題目大意
有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章