P4377 [USACO18OPEN]Talent Show

Posted wsmrxc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P4377 [USACO18OPEN]Talent Show相关的知识,希望对你有一定的参考价值。


一眼过去,0 / 1分数规划裸题。
但是仔细一想,贪心不对,那么没办法判断重量与比率同时满足关系。
分析发现其实是一个 二元组,可以转化成01背包做。
注意此处因为只需要判断可行性,那么01背包只需要记录到W即可,像这样:

f[min(W, j + w[i])] = max(f[min(W, j + w[i])], f[j] + p[i]);

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 250 + 10;

int N, W;
int w[MAXN], t[MAXN];

double p[MAXN]; double f[1010];
inline bool check(double x)
{
    for(int i = 1; i <= N; i++) p[i] = 1.0 * t[i] - 1.0 * x * w[i];
    fill(f, f + W + 1, -(1 << 29));
    f[0] = 0;
    for(int i = 1; i <= N; i++){
        for(int j = W; j >= 0; j--)
            f[min(W, j + w[i])] = max(f[min(W, j + w[i])], f[j] + p[i]);
    }
    return f[W] >= 0;
}

int main()
{
    cin>>N>>W;
    double l = 0, r = 0;
    for(int i = 1; i <= N; i++) 
        scanf("%d%d", &w[i], &t[i]), r += t[i];

    while(r - l > 1e-4){
        double mid = (l + r) / 2;
        if(check(mid)) l = mid;
        else r = mid;
    }
    cout<<(int)(l * 1000)<<endl;
    return 0;
}

以上是关于P4377 [USACO18OPEN]Talent Show的主要内容,如果未能解决你的问题,请参考以下文章

[USACO18OPEN]Talent Show

题解Luogu P4377 Talent Show

[Usaco2018 Open]Talent Show

LG4377 「USACO2018OPEN」Talent Show 线性规划+背包

P4379 [USACO18OPEN]Lemonade Line

[USACO18OPEN] Multiplayer Moo (并查集+维护并查集技巧)