码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • USACO18OPEN Talent Show G


    P4377 [USACO18OPEN] Talent Show G

    题目大意

    有 n n n头奶牛,第 i i i头奶牛的重量为 w i w_i wi​,才艺水平为 t i t_i ti​。你需要选择若干头奶牛,使得

    • 这些奶牛的总重量至少为 W W W
    • 总才艺值与总重量的比值最大的一组获胜

    这些奶牛的总重量大于等于 W W W,求选择若干头奶牛能够达到的才艺与重量的比值的最大值,并输出这个最大值成一千再向下取整后的值。

    1 ≤ n ≤ 250 , 1 ≤ W ≤ 1000 , 1 ≤ w i ≤ 1 0 6 , 1 ≤ t i ≤ 1 0 3 1\leq n\leq 250,1\leq W\leq 1000,1\leq w_i\leq 10^6,1\leq t_i\leq 10^3 1≤n≤250,1≤W≤1000,1≤wi​≤106,1≤ti​≤103


    题解

    二分答案,设当前二分的值为 m i d mid mid,则

    ∑ t i ∑ w i ≥ m i d \dfrac{\sum t_i}{\sum w_i}\geq mid ∑wi​∑ti​​≥mid

    由此可得

    ∑ t i ≥ m i d × ∑ w i \sum t_i\geq mid\times \sum w_i ∑ti​≥mid×∑wi​

    移项得

    ∑ ( t i − m i d × w i ) ≥ 0 \sum(t_i-mid\times w_i)\geq 0 ∑(ti​−mid×wi​)≥0

    令 v i = t i − m i d × w i v_i=t_i-mid\times w_i vi​=ti​−mid×wi​,那么每头奶牛的重量为 w i w_i wi​,价值为 w i w_i wi​,用背包即可解决。重量大于等于 W W W的都记录在 f W f_W fW​中。最后只需判断 f W f_W fW​是否大于 0 0 0即可。

    为了方便,所有 t t t值在一开始就乘了 1000 1000 1000。

    时间复杂度为 O ( n w log ⁡ S ) O(nw\log S) O(nwlogS),其中 S = ∑ w i S=\sum w_i S=∑wi​。

    code

    #include
    using namespace std;
    int n,w;
    long long f[305][1005];
    struct node{
    	int w,t;
    }v[305];
    bool check(long long k){
    	for(int i=0;i<=n;i++){
    		for(int j=0;j<=w;j++) f[i][j]=-1e15;
    	}
    	f[0][0]=0;
    	for(int i=1;i<=n;i++){
    		for(int j=0;j<=w;j++) f[i][j]=f[i-1][j];
    		for(int j=0;j<=w;j++){
    			f[i][min(j+v[i].w,w)]=max(f[i][min(j+v[i].w,w)],f[i-1][j]+v[i].t-k*v[i].w);
    		}
    	}
    	return f[n][w]>=0;
    }
    int main()
    {
    	scanf("%d%d",&n,&w);
    	for(int i=1;i<=n;i++){
    		scanf("%d%d",&v[i].w,&v[i].t);
    		v[i].t*=1000;
    	}
    	int l=0,r=3e8,mid;
    	while(l<=r){
    		mid=l+r>>1;
    		if(check(mid)) l=mid+1;
    		else r=mid-1;
    	}
    	printf("%d",l-1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    基于低代码平台的OA系统,更灵活高效!
    方圆的秒杀系统优化方案实战,(八)商品库存缓存的初始化、扣减和新增
    生物医疗行业线上推广解决方案_上海添力
    11.22 - 每日一题 - 408
    C# 将本地图片插入到Excel文件中
    【免费】中国电子学会2024年03月份青少年软件编程Python等级考试试卷一级真题(含答案)
    华为配置直连三层组网直接转发示例
    文件操作安全之-文件上传原理篇
    OPA Gatekeeper:Kubernetes的策略和管理
    工作微信统一管理(还带监管功能)
  • 原文地址:https://blog.csdn.net/tanjunming2020/article/details/132642232
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号