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. python中常用内置函数和关键词

    Python 常用内置函数如下: Python 解释器内置了很多函数和类型,您可以在任何时候使用它们.以下按字母表顺序列出它们. 1. abs()函数 返回数字的绝对值. print( abs(-45 ...

  2. 罗马数字转整数,Java执行时间超过100%用户的写法

    执行用时:2 ms, 在所有 Java 提交中击败了100.00%的用户 题目 https://leetcode-cn.com/problems/roman-to-integer 罗马数字包含以下七种 ...

  3. Dom基础(一):attribute和properrty的区别

    properrty:修改对象属性不会体现到html结构中,针对DOM节点自带属性(id,className,style) attribute:修改html属性,会改变html结构,大多可以添加自定义属 ...

  4. Spring Security实现基于RBAC的权限表达式动态访问控制

    昨天有个粉丝加了我,问我如何实现类似shiro的资源权限表达式的访问控制.我以前有一个小框架用的就是shiro,权限控制就用了资源权限表达式,所以这个东西对我不陌生,但是在Spring Securit ...

  5. 【HCIE】ipv6之6to4隧道如何计算48位前缀地址

    6to4隧道支持router-router,host-router,router-host,host-host 采用专用6to4地址,前缀为2002::/16 其中如何结合ipv4地址? 2002:i ...

  6. 【第三课】常用的Linux命令(学习笔记)

    4月8日 学习笔记打卡

  7. 论文解读(Graphormer)《Do Transformers Really Perform Bad for Graph Representation?》

    论文信息 论文标题:Do Transformers Really Perform Bad for Graph Representation?论文作者:Chengxuan Ying, Tianle Ca ...

  8. Lab1:练习四——分析bootloader加载ELF格式的OS的过程

    练习四:分析bootloader加载ELF格式的OS的过程. 1.题目要求 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代码和通过qemu来运行并调试bootl ...

  9. 一款高速的NET版的离线免费OCR

    PaddleOCR.Onnx 一款基于Paddle的OCR,项目使用ONNX模型,速度更快.本项目同时支持X64和X86的CPU上使用.本项目是一个基于PaddleOCR的C++代码修改并封装的.NE ...

  10. 一、深入学习c++先要练好的内功

    掌握进程虚拟地址空间区域的划分 课程讲的内容建立在x86 32位的Linux系统下. 任何的编程语言会产生两种东西:指令和数据.磁盘上的可执行文件在启动时都会加载到内存当中,但是不会加载到物理内存中, ...