NC14662 小咪买东西
NC14662 小咪买东西
题目
题目描述
小咪是一个土豪手办狂魔,这次他去了一家店,发现了好多好多( \(n\) 个)手办,但他是一个很怪的人,每次只想买 \(k\) 个手办,而且他要让他花的每一分钱都物超所值,即:买下来的东西的总价值/总花费= \(max\) 。请你来看看,他会买哪些东西吧。
输入描述
多组数据。
第一行一个整数 \(T\),为数据组数。
接下来有 \(T\) 组数据。
对于每组数据,第一行两个正整数 \(n\) ,\(k\) ,如题。
接下来 \(n\) 行,每行有两个正整数 \(c_i\) ,\(v_i\) 。分别为手办的花费和它对于小咪的价值。
输出描述
对于每组数据,输出一个数,即能得到的总价值/总花费的最大值。精确至整数。
示例1
输入
1
5 1
1 2
2 3
3 4
4 5
5 6
输出
2
备注
\(1≤T≤10\)
\(1≤n≤10^4\)
\(1≤k≤n\)
\(1≤c_i,v_i≤10^4\)
题解
思路
知识点:01分数规划。
01分数规划的模板题。注意到,小于最优解的答案一定有一种方案大于等于它,大于最优解的答案不存在方案可行,符合用二分答案求解的要求(唯一零点,单调性)。我们先确定一个答案 \(mid\) ,若 \(mid\) 小于等于最优答案,则存在方案满足如下公式:
\frac{\sum v_i}{\sum c_i} &\geq mid\\
\sum v_i &\geq mid \sum c_i\\
\sum (v_i - mid\cdot c_i) &\geq 0
\end{aligned}
\]
每次检验把 \(v_i - mid \cdot c_i\) 从大到小排序,选前 \(k\) 大加和判断 \(\sum (v_i-mid\cdot c_i) \geq 0\) ,若满足则小于等于答案,否则大于答案。
时间复杂度 \(O(n \log n +k)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n, k;
int c[10007], v[10007], cv[10007];
bool check(int mid) {
for (int i = 0;i < n;i++) cv[i] = v[i] - mid * c[i];
sort(cv, cv + n, [&](int a, int b) {return a > b;});
long long sum = 0;
for (int i = 0;i < k;i++) sum += cv[i];
return sum >= 0;
}
bool solve() {
cin >> n >> k;
for (int i = 0;i < n;i++) cin >> c[i] >> v[i];
int l = 0, r = 1e4;
while (l <= r) {
int mid = l + r >> 1;
if (check(mid)) l = mid + 1;
else r = mid - 1;
}
cout << r << '\n';
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}
NC14662 小咪买东西的更多相关文章
- 例题:超市买东西的程序。输入商品信息,计算价格,价格满多少元打折。这道题用到结构体,集合,for循环,if else语句
知识要点: 集合和数组的区别:数组是连续的,同一类型的一块区域,而集合可以是不连续的,多种数据类型的. 集合属性:.count 方法:.Add() 将对象添加到ArrayList中实际包含的元素数 ...
- 单调队列+二分 G - Queue 小阳买水果
B. Queue 这个题目会做的很偶然,突然想到的,因为我们要求离这只海象的最远的比他年轻的海象,这个年轻的海象可以用单调栈维护. 就是从前往后遍历一遍,单调栈里面存年龄从小往大的海象,这个为什么这么 ...
- JS循环语句作业讲解(折纸、兔子生兔子、买东西组合)
1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米: varn = 0;varg = 0.0001;while(){ g= g *2; n++ (g>8848bre ...
- 牛客小白月赛13 小A买彩票 (记忆化搜索)
链接:https://ac.nowcoder.com/acm/contest/549/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 小A买彩票-(组合数)
链接:https://ac.nowcoder.com/acm/contest/549/C来源:牛客网 题目描述 小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富.已知购买一张彩票需要3元,而彩票 ...
- 牛客小白月赛16 D 小阳买水果 (思维题)
链接:https://ac.nowcoder.com/acm/contest/949/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- JAVA小程序-----买衣服
import java.util.Scanner; //引用扫描器 public class TestDemo1 { public static void main(String [] args){ ...
- 关于float与double区别
Problem A: 啤酒和饮料 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 175 Solved: 29 [Submit][Status][We ...
- YTU 2505: 啤酒和饮料
2505: 啤酒和饮料 时间限制: 1 Sec 内存限制: 128 MB 提交: 850 解决: 318 题目描述 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了s元. 我们 ...
随机推荐
- 从零搭建Pytorch模型教程(三)搭建Transformer网络
前言 本文介绍了Transformer的基本流程,分块的两种实现方式,Position Emebdding的几种实现方式,Encoder的实现方式,最后分类的两种方式,以及最重要的数据格式的介绍. ...
- DevExpress控件与VS和.NET各个版本的支持情况
如下图所示,绿色Yes代表支持,红色No代表不支持.对于有些人觉得装了dev后,vs工具箱没有,一般都是以下两大问题: 1.要么你的Dev的版本不支持你当前的VS版本,没有很正常. 2.要么你的项目的 ...
- Aop踩坑!记一次模板类调用注入属性为空的问题
问题起因 在做一个需求的时候,发现原来的代码逻辑都是基于模板+泛型的设计模式,模板用于规整逻辑处理流程,泛型用来转换参数和选取实现类.听上去是不是很nice! 类目录结构 AbstractTestAo ...
- HCNP Routing&Switching之MUX VLAN
前文我们了解了代理ARP相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16188230.html:今天我们再来聊一聊vlan隔离相关话题MUX VLA ...
- drf-Serializers
What is serializers? serializers主要作用是将原生的Python数据类型(如 model querysets )转换为web中通用的JSON,XML或其他内容类型. DR ...
- Nginx的常用配置
Nginx配置文件结构 设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为 nobodyuser root; worker进程工作数设置,一般来说C ...
- Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?
在<Redis 数据缓存满了怎么办?>我们知道 Redis 缓存满了之后能通过淘汰策略删除数据腾出空间给新数据. 淘汰策略如下所示: 设置过期时间的 key volatile-ttl.vo ...
- 低代码 —— 初步认识 Appsmith
初步认识 Appsmith appsmith 是什么 appsmith 是 github 上的一个开源项目,截至此刻(20220512)有 17.7k Star. Appsmith 是一个低代码.开源 ...
- 无线:WEP
WEP是Wired Equivalent Privacy的简称,有线等效保密(WEP)协议是对在两台设备间无线传输的数据进行加密的方式,用以防止非法用户窃听或侵入无线网络.不过密码分析学家已经找出 W ...
- There appears to be trouble with your network connection. Retrying…
yarn 错误There appears to be trouble with your network connection. Retrying- 原因:yarn超时 解决途径: #查看代理 yar ...