Problem 6 二分
$des$
有 $n$ 个物品,第 $i$ 个物品有两个属性 $k_i, b_i$ ,表示它在时刻 $x$ 的价值为 $k_i
\times x + b_i$ .
当前处于时刻 $0$ ,你可以选择不超过 $m$ 个物品,使得存在某个整数时刻 $t$, $t >= 0$
,你选择的所有物品的总价值大于等于 $S$ .
给出 $S$,求 $t$ 的最小值。

$sol$
选择任意一个集合,得到的收益和都可以表示为一个一次函数的形式。只关心这些
一次函数的最大值,可以发现这个最大值一定是先降后增的(当 t 非常大时,$k_i \times t > b_i$, 也有可能是单调递增或者单调递减)。
因此只需要 check 一下 0 时刻是否符合条件,如果不符合则进行二分。
注意 check 的时候只需要找出最大的 m 个即可,因此可以 O(n) 地做,具体做法是快排
的过程中只递归一边。直接用 STL 的 nth_element() 即可。
时间复杂度 $O(nlog10^9)$
$code$
#include <bits/stdc++.h>
#define Rep(i, j, k) for (int i = j; i <= k; i++)
using namespace std;
int Read() {
char c = getchar(); int x = ;
int sig = ;
while (c < '' || c > '') { if (c == '-') sig = -; c = getchar(); }
while (c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * sig;
}
const int N = 1e6 + ;
typedef long long LL;
int n, m;
LL S;
int k[N], b[N];
LL val[N];
bool check(int x) {
Rep(i, , n) val[i] = 1ll * k[i] * x + b[i];
nth_element(val + , val + m, val + n + , greater<LL>());
LL sum = ;
Rep(i, , m) if (val[i] > && (sum += val[i]) >= S) return true;
return false;
}
int main() {
n = Read(), m = Read(); scanf("%lld", &S);
Rep(i, , n) k[i] = Read(), b[i] = Read();
if (check()) {puts(""); return ;}
int L = , R = 1e9, Ans;
while (L <= R) {
int mid = (L + R) / ;
if (check(mid)) Ans = mid, R = mid;
else L = mid + ;
}
printf("%d\n", Ans);
return ;
}
Problem 6 二分的更多相关文章
- codeforces 761 D. Dasha and Very Difficult Problem(二分+贪心)
题目链接:http://codeforces.com/contest/761/problem/D 题意:给出一个长度为n的a序列和p序列,求任意一个b序列使得c[i]=b[i]-a[i],使得c序列的 ...
- codeforces 1288D. Minimax Problem(二分)
链接:https://codeforces.com/contest/1288/problem/D D. Minimax Problem 题意:给定n个数组,长度为m,从n中数组挑选两个数组,两个数组中 ...
- HDU 4282 A very hard mathematic problem --枚举+二分(或不加)
题意:问方程X^Z + Y^Z + XYZ = K (X<Y,Z>1)有多少个正整数解 (K<2^31) 解法:看K不大,而且不难看出 Z<=30, X<=sqrt(K) ...
- HDU 5371 (2015多校联合训练赛第七场1003)Hotaru's problem(manacher+二分/枚举)
pid=5371">HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分同样,第一部分与第二部分对称. 如今给你一个长为n(n<10^5)的序 ...
- poj3258 River Hopscotch(二分最小值,好题)
https://vjudge.net/problem/POJ-3258 二分最小值,判断需要删去的点的个数,如果大于给定,则直接return 0,则说明该数需要再小. 最后注意,起点是0终点是l,起点 ...
- poj2456 Aggressive cows(二分查找)
https://vjudge.net/problem/POJ-2456 二分,从最大长度开始,不断折半试,如果牛全放下了,就是可行,修改下界,否则改上届. #include<iostream&g ...
- poj1064 Cable master(二分查找,精度)
https://vjudge.net/problem/POJ-1064 二分就相当于不停地折半试. C++AC,G++WA不知为何,有人说C函数ans那里爆int了,改了之后也没什么用. #inclu ...
- Educational Codeforces Round 61 D 二分 + 线段树
https://codeforces.com/contest/1132/problem/D 二分 + 线段树(弃用结构体型线段树) 题意 有n台电脑,只有一个充电器,每台电脑一开始有a[i]电量,每秒 ...
- POJ 3104 Drying [二分 有坑点 好题]
传送门 表示又是神题一道 Drying Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9327 Accepted: 23 ...
随机推荐
- warning: LF will be replaced by CRLF in application.yml. The file will have its origina解决方法
环境: windows提交时报错如图所示: 原因是存在符号转义问题 windows中的换行符为 CRLF, 而在linux下的换行符为LF,所以在执行add . 时出现提示,解决办法: git con ...
- ArcGIS JS 使用Proxy之 Printing Tools unable to connect to mapServer
ArcGIS JS使用Proxy.ashx将地图服务隐藏,并在微博服务器端增加了地图服务权限判断. Proxy.ashx做了如下设置, <serverUrl url="http://l ...
- [洛谷P5329][SNOI2019]字符串
题目大意:给一个长度为$n$的字符串$s$,字符串$p_i$为字符串$s$去掉第$i$个字符后形成的字符串.请给所有字符串$p_i$排序(相同字符串按编号排序) 题解:先去掉所有连续相同字符,因为它们 ...
- git学习笔记 ---版本退回
我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容: Git is a distributed version c ...
- C# HtmlAgilityPack爬取静态页面
最近对爬虫很感兴趣,稍微研究了一下,利用HtmlAgilityPack制作了一个十分简单的爬虫,这个简易爬虫只能获取静态页面的Html HtmlAgilityPack简介 HtmlAgilityPac ...
- kubernetes第八章--NFS PersistentVolume
- PHP 结合 Bootstrap 实现学生列表以及添加学生功能实现(继上篇登录及注册功能之后)
本人是一位学生,正在学习当中,可能BUG众多,请见谅并指正,谢谢!!! 学生列表实现 HTML: <!DOCTYPE html> <html> <head> < ...
- React Native 开发豆瓣评分(二)路由配置
路由管理使用官方推荐的 React Navigation; 配置环境 安装相关依赖 yarn add react-navigation react-native-gesture-handler Lin ...
- tensorflow 单机多GPU训练时间比单卡更慢/没有很大时间上提升
使用tensorflow model库里的cifar10 多gpu训练时,最后测试发现时间并没有减少,反而更慢 参考以下两个链接 https://github.com/keras-team/keras ...
- 【hadoop】在eclipse上运行WordCount的操作过程
序:本以为今天花点时间将WordCount例子完全理解到,但高估自己了,更别说我只是在大学选修一学期的java,之后再也没碰过java语言了 总的来说,从宏观上能理解具体的程序思路,但具体到每个代码有 ...