Luogu P1080 国王游戏

Description:

恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

Analysis:

from: _rqy



Code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAX_N = 1001;
struct officer
{
    int a,b;
    bool operator < (officer Off) const {
        return a*b < Off.a*Off.b;
    }
}e[MAX_N];
int n;
long long ans,tmp;
int main()
{
    scanf("%d",&n);
    for(int i = 0;i <= n;++i)
    {
        scanf("%d%d",&e[i].a,&e[i].b);
    }
    sort(e + 1,e + 1+ n);
    //ans = 1e9 + 7;
    tmp = e[0].a;
    for(int i = 1; i <= n;++i)
    {
        ans = max(ans,tmp/e[i].b);
        tmp *= e[i].a;
    }
    printf("%lld
",ans);
    return 0;
}
岂能尽如人意,但求无愧我心
原文地址:https://www.cnblogs.com/Zforw/p/11299061.html