Noip2012-国王游戏

“使赏赐最多的大臣获得的赏赐尽可能少”

这类题目要么是二分,要么是贪心。emmmmm这题看上去比较像贪心(不要问我为啥就是玄学orz)

考虑两个大臣x,y,(对于i来说,左手的数字是a[i].l,右手的数字是a[i].r)

如果x排在y前面,

则有:total*a[x].l/a[y].r<total*a[y].l/a[x].r

所以:a[x].l*a[x].r<a[y].l*a[y].r

然后排个序就没了啊……

上代码!!!

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;
const int maxn=1005;
typedef long long ll;
struct node
{
	int l,r;
}a[maxn]; 
int cmp(node x,node y)
{
	return x.l*x.r<y.l*y.r;
}
int main()
{
	int n,kl,kr;scanf("%d%d%d",&n,&kl,&kr);
	for(int i=1;i<=n;i++) scanf("%d%d",&a[i].l,&a[i].r);
	ll s=kl;
	sort(a+1,a+1+n,cmp);
	ll maxv=0;
	for(int i=1;i<=n;i++)
	{
		maxv=max(maxv,s/a[i].r);
		s*=a[i].l;
	}
	cout<<maxv<<endl;
	return 0;
}

emmmm这题是要高精的然而我懒得写emmmmm

总结一下:

对于这种简单贪心来说,考虑2个元素满足什么条件才能保证x排在y前面

然后总结出公式sort一下就好啦。

嘿嘿嘿超快乐。

猜你喜欢

转载自blog.csdn.net/Mmm040403/article/details/83582947