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\) 小于等于最优答案,则存在方案满足如下公式:

\[\begin{aligned}
\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 小咪买东西的更多相关文章

  1. 例题:超市买东西的程序。输入商品信息,计算价格,价格满多少元打折。这道题用到结构体,集合,for循环,if else语句

    知识要点: 集合和数组的区别:数组是连续的,同一类型的一块区域,而集合可以是不连续的,多种数据类型的. 集合属性:.count 方法:.Add()  将对象添加到ArrayList中实际包含的元素数 ...

  2. 单调队列+二分 G - Queue 小阳买水果

    B. Queue 这个题目会做的很偶然,突然想到的,因为我们要求离这只海象的最远的比他年轻的海象,这个年轻的海象可以用单调栈维护. 就是从前往后遍历一遍,单调栈里面存年龄从小往大的海象,这个为什么这么 ...

  3. JS循环语句作业讲解(折纸、兔子生兔子、买东西组合)

    1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米: varn = 0;varg = 0.0001;while(){ g= g *2; n++ (g>8848bre ...

  4. 牛客小白月赛13 小A买彩票 (记忆化搜索)

    链接:https://ac.nowcoder.com/acm/contest/549/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  5. 小A买彩票-(组合数)

    链接:https://ac.nowcoder.com/acm/contest/549/C来源:牛客网 题目描述 小A最近开始沉迷买彩票,并且希望能够通过买彩票发家致富.已知购买一张彩票需要3元,而彩票 ...

  6. 牛客小白月赛16 D 小阳买水果 (思维题)

    链接:https://ac.nowcoder.com/acm/contest/949/D来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  7. JAVA小程序-----买衣服

    import java.util.Scanner; //引用扫描器 public class TestDemo1 { public static void main(String [] args){ ...

  8. 关于float与double区别

    Problem A: 啤酒和饮料 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 175  Solved: 29 [Submit][Status][We ...

  9. YTU 2505: 啤酒和饮料

    2505: 啤酒和饮料 时间限制: 1 Sec  内存限制: 128 MB 提交: 850  解决: 318 题目描述 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了s元. 我们 ...

随机推荐

  1. Vim 中进行文本替换

    Vim 中进行文本替换 格式 用法 :[range]s/from/to/[flags] tips: [] 表示该内容可选 参数 from 需要替换的字符串(可以是正则表达式) to 替换后的字符串 r ...

  2. 基于.Net C# 通信开发-串口调试助手

    基于.Net C# 通信开发-串口调试助手 1.概述 串口调试助手,广泛应用于工控领域的数据监控.数据采集.数据分析等工作,可以帮助串口应用设计.开发.测试人员检查所开发的串口应用软硬件的数据收发状况 ...

  3. 干货|带你体验一次原生OpenStack云平台发放云主机的过程

    一个执着于技术的公众号 1 前言 上一章节我们完成了OpenStack云平台的搭建工作,今天就带大家一起学习下如何发放一台云主机 点击查看:如何搭建一套OpenStack云平台 2 发放OpenSta ...

  4. Docker系列教程02-操作Docker容器

    简介 通过前面的学习,相信您已经对镜像有所了解,是时候学习容器了. 容器是Docker的另一个核心概念.简单来说,容器是镜像的一个运行实例.正如从虚拟机模板上启动VM一样,用户也同样可以从单个镜像上启 ...

  5. CSS常用技术

    1.处理图片底部 5px 间距 <style> body {background: #2d97db;} .imgBox { background: #fff; font-size: 0; ...

  6. (Bezier)贝塞尔曲在路径规划的运用

    前言 之前被安排了活,一个局部区域机器运动控制的工作,大致是一个机器位于一个极限区域时候,机器要进入一个特殊的机制,使得机器可以安全的走出来.其中用到了bezier曲线进行优化路径,今天写一下,正好也 ...

  7. JS运算符,流程控制,函数,内置对象,BOM与DOM

    运算符 1.算数运算符 运算符 描述 + 加 - 减 * 乘 / 除 % 取余(保留整数) ++ 递加 - - 递减 ** 幂 var x=10; var res1=x++; '先赋值后自增1' 10 ...

  8. 【多线程】线程同步 synchronized

    由于同一进程的多个线程共享同一块存储空间 , 在带来方便的同时,也带来了访问 冲突问题 , 为了保证数据在方法中被访问时的正确性 , 在访问时加入 锁机制synchronized , 当一个线程获得对 ...

  9. 聊聊C#中的Visitor模式

    写在前面 Visitor模式在日常工作中出场比较少,如果统计大家不熟悉的模式,那么它榜上有名的可能性非常大.使用频率少,再加上很多文章提到Visitor模式都着重于它克服语言单分派的特点上面,而对何时 ...

  10. ZIP压缩输入/输出

    学习内容: 一.压缩文件 1.利用ZipOutputStream类对象,可将文件压缩. 2.ZipOutputStream类构造方法:ZipOutputStream(OutputStream out) ...