P4377 [USACO18OPEN] Talent Show G
P4377 [USACO18OPEN] Talent Show G
[P4377 USACO18OPEN] Talent Show G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目
题目描述
Farmer John 要带着他的
在到达时,Farmer John 就被今年达牛秀的新规则吓到了:
(一)参加比赛的一组奶牛必须总重量至少为
(二)总才艺值与总重量的比值最大的一组获得胜利。
FJ 注意到他的所有奶牛的总重量不小于
输入格式
第一行是两个整数,分别表示牛的个数
第
输出格式
请求出 Farmer 用一组总重量最少为
如果你的答案是
样例 #1
样例输入 #1
3 15
20 21
10 11
30 31
样例输出 #1
1066
提示
样例解释
在这个例子中,总体来看最佳的才艺与重量的比值应该是仅用一头才艺值为
数据规模与约定
对于全部的测试点,保证
思路
正解是01分数规划 + 背包
1、分数规划
二分答案
即
所以
2、背包
设 dp[i] 表示重量为
大于等于
那么
code
#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define fd(x , y , z) for(int x = y ; x >= z ; x --)
#define LL long long
using namespace std;
const int N = 255 , M = 1005;
const double eps = 1e-6;
const int inf = 1e8 + 5;
int n , W;
double p[N] , dp[M];
LL w[N] , t[N] , st;
double ck () {
fu (i , 1 , W) dp[i] = -inf;
fu (i , 1 , n) {
fd (j , W , 0) {
if (j + w[i] >= W) dp[W] = max (dp[W] , dp[j] + p[i]);
else dp[j + w[i]] = max (dp[j + w[i]] , dp[j] + p[i]);
}
}
return dp[W];
}
double fans () {
double l = 0 , r = st , mid;
while (r - l > eps) {
mid = (l + r) / 2;
fu (i , 1 , n) p[i] = t[i] - w[i] * mid;
if (ck () >= eps) l = mid + eps;
else r = mid;
}
return l;
}
int main () {
scanf ("%d%d" , &n , &W);
fu (i , 1 , n)
scanf ("%lld%lld" , &w[i] , &t[i]) , st += t[i];
printf ("%lld" , (LL)(fans () * 1000));
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端