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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43819762/article/details/104852132
今日推荐