1. 程式人生 > >Noip2012-國王遊戲

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一下就好啦。

嘿嘿嘿超快樂。