NOIp2012 国王游戏

Luogu

贪心妙题蛙

开始看到最大值最小化,还以为是二分... 最后证明是我太 naive 了

先设 \(A_i\)\(i\) 左手上的数字,\(B_i\)\(i\) 右手上的数字,下标为 \(0\) 的是国王的数字

然后如果

\[ \max \lbrace \frac{1}{B_i}*\prod_{j=0}^{i-1} A_j,\frac{A_i}{B_{i+1}}*\prod_{j=0}^{i-1} A_j\rbrace>\max \lbrace \frac{A_{i+1}}{B_i}*\prod_{j=0}^{i-1} A_j,\frac{1}{B_{i+1}}*\prod_{j=0}^{i-1} A_j\rbrace \]

那么第 \(i\) 个大臣和第 \(i+1\) 个大臣交换是有可能使得解更优的。

然后把 \(\prod_{j=0}^{i-1} A_j\) 这个东西丢掉以后,再将两边都同时乘上 \(B_i*B_{i+1}\),就只需要比较下面这个式子

\[ \max \lbrace B_{i+1},A_i*B_i\rbrace>\max \lbrace A_{i+1}*B_{i+1},B_i \rbrace \]

因为每个大臣手上的数字都是正整数,所以可以得到以下不等式

  • \(A_i*B_i>B_i\)
  • \(A_{i+1}*B_{i+1}>B_{i+1}\)

所以如果当 \(\max \lbrace B_{i+1},A_i*B_i\rbrace>\max \lbrace A_{i+1}*B_{i+1},B_i \rbrace\) 时,\(A_i*B_i>A_{i+1}*B_{i+1}\)

只要将 \(A_i*B_i\) 当关键字排下序就一定是最优的顺序了。

注意写高精

下面的代码为了美观,就直接贴上 \(60\,pts\) 的无高精代码好了 qwq

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

const int max_n = 1000 + 5;

struct Node
{
    int a, b, c;
}P[max_n];

int N, Ans;

bool cmp(Node x, Node y)
{
    return x.c < y.c;
}

int main()
{
    int mul = 1;
    std::cin >> N;
    std::cin >> P[0].a >> P[0].b;
    for(int i = 1; i <= N; ++i)
    {
        std::cin >> P[i].a >> P[i].b;
        P[i].c = P[i].a * P[i].b;
    }
    std::sort(&P[1], &P[N + 1], cmp);
    for(int i = 1; i <= N; ++i)
    {
        mul *= P[i - 1].a;
        if(mul / P[i].b > Ans) Ans = mul / P[i].b;
    }
    std::cout << Ans;
    return 0;
}

转载于:https://www.cnblogs.com/zcdhj/p/8613369.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值