“使赏赐最多的大臣获得的赏赐尽可能少”
这类题目要么是二分,要么是贪心。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一下就好啦。
嘿嘿嘿超快乐。