P8365 [LNOI2022] 吃 题解

· · 题解

一道很有趣的贪心题目。

首先我们可以确定,我们一定是先做加法再做乘法,这样才可以使我们的得数最大。

我们考虑将食物按照 a_i 的大小分为两类:

设第二类食物的 \prod a_i = A,那么我们一个 b 都不选的结果就是 AB

如果我们选择一个 b,那么其价值就会变为 \frac{B+b_i}{a_i}A。 我们枚举找到这个最大的 \frac{B+b_i}{a_i} 即可。

当然,如果我们枚举到的所有食物都会让这个 \frac{B+b_i}{a_i} < B,那我们还不如不选,此时 b_i = 0,a_i = 1

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1000010;
const ll mod = 1e9 + 7;
int n;
ll a[N], b[N];
int main()
{
    scanf("%d", &n);
    ll ans = 1;
    a[0] = 1;
    for (int i = 1; i <= n; i++)
        scanf("%lld", &a[i]);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &b[i]);
        if (a[i] == 1)ans = (ans + b[i]) % mod;
    }
    int maxn = 0;
    for (int i = 1; i <= n; i++)
    {
        if (a[i] == 1)continue;
        if ((ans + b[i]) * a[maxn] > (ans + b[maxn]) * a[i])
            maxn = i;
    }
    ans = (ans + b[maxn]) % mod;
    for (int i = 1; i <= n; i++)
    {
        if (i == maxn)continue;
        ans = (ans * a[i]) % mod;
    }
    printf("%lld\n", ans);
    return 0;
}