传送门:小咪买东西

传送门:wyh的物品

这两道题的题目大致相似,解法也大抵相似(双倍经验!!),接下来主要讲解wyh的物品

题目描述:

wyh学长现在手里有 n 个物品,这 n 个物品的重量和价值都告诉你,然后现在让你从中选取 k 个,问你在
所有可能选取的方案中,最大的单位价值为多少(单位价值为选取的 k 个物品的总价值和总重量的比值

首先看到这道题后,我当时是并不知道01规划这个思想的,所以我的第一想法肯定和大部分人一样直接想到了贪心思想(就是比值排一个序然后取前K个),即使当我们得知01规划是正解后我当时还未能看出贪心的错误,后来我想到了一个反例

假设我们有以下这三个分数
100/2     1000000/99999      1/2
如果贪心来说我们选取得肯定是前两个,但是显然因为假分数的问题(如果确保是真分数,我们的贪心就是正确的)
我们此时的分数2并没有分数3来的更加优秀,所以我们的贪心思想就变得假了

既然我们发现我们的贪心思想假了之后,接下来就是我们的正解了01规划

我们观察我们的问题,发现最终的答案显然是
∑ i = 1 k v i \sum_{i = 1}^k{v_i} ∑i=1k​vi​ \ \backslash \ ∑ i = 1 k c i \sum_{i = 1}^k{c_i} ∑i=1k​ci​这个的最大值(选取K个)

我们假设这个式子的值为L

我们得到

∑ i = 1 k v i \sum_{i = 1}^k{v_i} ∑i=1k​vi​ \ \backslash \ ∑ i = 1 k c i \sum_{i = 1}^k{c_i} ∑i=1k​ci​ ≥ \geq ≥L

得到 ∑ i = 1 k v i \sum_{i = 1}^k{v_i} ∑i=1k​vi​ — ∑ i = 1 k c i \sum_{i = 1}^k{c_i} ∑i=1k​ci​ × \times ×L ≥ \geq ≥ 0

并且当我们得到这样的一个式子之后,和之前的比值就完全不同了,因为是加减法所以此时我们的这个式子是可以拆的,也就是k个```Vi-Ci*L``个式子相加,此时我们在根据这个来排序即可

对于怎么找到我们的L,我们可以选择采用二分来找到,对于每一次我们的L,假设我们的求和式子最终的答案是大于0的话,说明我们的L是可以继续增加因为显然这个式子是关于L单调减的

这就是最朴素的01规划思想了

加下来是我们的代码部分

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
#define maxn 1000000
#define ll_maxn 0x3f3f3f3f3f3f3f3f
const double eps=1e-8;
int T;
struct Thing{double c,v,bizhi;
}thing[maxn];
int n,k;
bool cmp(Thing a,Thing b) {return a.bizhi>b.bizhi;
}
int check(double mid) {for(int i=1;i<=n;i++){thing[i].bizhi=thing[i].v-thing[i].c*mid;}sort(thing+1,thing+n+1,cmp);double ans=0;for(int i=1;i<=k;i++) {ans+=thing[i].bizhi;}if(ans>=0) return true;else return false;
}
int main() {T=read();while(T--) {memset(thing,0,sizeof(thing));n=read();k=read();for(int i=1;i<=n;i++) {thing[i].c=read();thing[i].v=read();}double l=0,r=1e7;double ans=0;while(r-l>=eps) {double mid=(l+r)/2;if(check(mid)) {ans=mid;l=mid;}else {r=mid;}}printf("%.2lf\n",ans);}return 0;
}

刷题记录:牛客NC14662小咪买东西NC15446wyh的物品相关推荐

  1. 刷题记录:牛客NC15162小H的询问

    传送门:牛客 题目描述: 小H给你一个数组{a},要求支持以下两种操作: 1. 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间被认 ...

  2. NC14662 小咪买东西

    题目: NC14662 小咪买东西 ,哈哈,我们今天来看一道01分数规划的题嘛,这是选自牛客上的一道题,好了,我们一起来看看题意吧: 考虑到直接复制题目,或者截屏的方式不是很方便阅读,我就把直接题目链 ...

  3. 刷题记录:牛客NC24608[USACO 2011 Ope S]Learning Languages

    传送门:牛客 题目描述: [USACO11OPEN]Learning Languages S 农夫约翰的 N ( 2 < = N < = 10 , 000 ) N(2<=N<= ...

  4. 刷题记录:牛客NC24083Greedy Gift Takers

    传送门:牛客 题目描述 Farmer John's nemesis, Farmer Nhoj, has NNN cows (1≤N≤1051 \leq N \leq 10^51≤N≤105), con ...

  5. 刷题记录:牛客NC16129小小粉刷匠

    传送门:牛客 题目描述: "lalala,我是一个快乐的粉刷匠",小名一边快活地唱着歌,一边开心地刷着墙",兴致突然被打断,"小名,你今天如果刷不 完这一栋楼的 ...

  6. 刷题记录:牛客NC17889新建 Microsoft Office Word 文档

    传送门:牛客 题目描述: CSL正在学习<计算机办公自动化>文件的建立与删除. CSL发现,当他新建一个word文档时,会得到一个名为"新建 Microsoft Office W ...

  7. 刷题记录:牛客NC17193简单瞎搞题

    传送门;牛客 题目描述: 一共有 n个数,第 i 个数是 xi xi 可以取 [ l i , r i ] [li , ri] [li,ri] 中任意的一个值. 设 S = ∑ x i 2 S = \s ...

  8. 刷题记录:牛客NC19910[CQOI2007]矩形RECT

    传送门;牛客 题目描述: 给一个a*b矩形,由a*b个单位正方形组成.你需要沿着网格线把它分成分空的两部分,每部分所有格子连通,且至少 有一个格子在原矩形的边界上."连通"是指任两 ...

  9. 刷题记录:牛客NC16122郊区春游

    传送门:牛客 题目描述: 今天春天铁子的班上组织了一场春游,在铁子的城市里有n个郊区和m条无向道路,第i条道路连接郊区Ai和Bi, 路费是Ci.经过铁子和顺溜的提议,他们决定去其中的R个郊区玩耍(不考 ...

最新文章

  1. [BZOJ3693]圆桌会议[霍尔定理+线段树]
  2. 使用Image类提示内存不足问题
  3. 你所知道的都是错的!产品经理的十大认知错误
  4. 上传图片动态预览(兼容主流浏览器)
  5. 机器学习之支持向量机
  6. 机器学习实战的P264中代码对应的公式推导
  7. Java 8 Friday:大多数内部DSL已过时
  8. rust为什么显示不了国服_捋捋 Rust 中的 impl Trait 和 dyn Trait
  9. 类加载器以及双亲委派模型
  10. outlook 邮件 设置延迟送信
  11. 关于NavigationView中不能直接findviewById的解决办法
  12. 三菱gxworks3安装失败_三菱GX软件安装出错处理大全
  13. python股票收益率计算_股票分析之——收益率(附完整代码和讲解)
  14. NetBeans的下载、安装
  15. 2020年CSP-J2 CSP-S2 复赛题解
  16. sql基础语法,非常全建议收藏(大白菜程序猿欢迎大家关注)
  17. Android 用代码查看本机保存的Wifi密码
  18. easyExcel设置单个单元格(颜色)样式
  19. 什么是UI Path?
  20. 1.0.使用matplotlib模块简单绘图

热门文章

  1. .nomedia文件的作用
  2. 武道之路-炼体期五重天巅峰
  3. java类的加载时机和过程
  4. R语言使用levels()函数来查看factor因子变量水平级别(levels)、使用levels参数重新排序因子水平级别、并可视化柱状图
  5. 苏菲的世界-part2
  6. 反向代理服务器nginx-proxy-manager
  7. java不知名设计模式
  8. PSINS运动轨迹与惯性器件信息生成仿真
  9. 一步一步教你如何在GitHub上上传自己的项目
  10. Nginx + Tomcat 实现负载均衡