题解 Merchant
可以发现如果我们最终选择的物品集合已经确定,就很好求了
\(\sum k*t+\sum b \geqslant s\) ,二分即可
但现在我们无法确定该选哪些物品
因此我们只需要check一下0时刻是否符合条件,如果不符合则进行二分。
注意check的时候我们只需要找出最大的 \(m\) 个即可
有点玄学。
证一下它有单调性:
因为保证有解,令存在一个解为时刻 \(t\)
那么此时存在一个 \(\sum k*t+\sum b \geqslant s\)
考虑时刻 \(t+1\),发现多了个 \(\sum k\)
若 \(\sum k > 0\) ,可以二分
若 \(\sum k \leqslant 0\) ,0时刻一定更优,不必二分
- 有空复习下nth_element的使用
Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 1000010
#define ll long long
#define reg register int
//#define int long long
char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline ll read() {
ll ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
}
int n, m; ll s;
ll k[N], b[N];
const double eps=1e-8;
namespace force{
ll ans=(ll)(1e18);
void solve() {
int lim=1<<n;
double k1, b1, s1=s, t;
for (reg s=1,s2,cnt; s<lim; ++s) {
k1=0; b1=0; cnt=0; s2=s;
do {s2&=(s2-1); ++cnt;} while (s2);
if (cnt>m) continue;
for (reg i=0; i<n; ++i) if (s&(1<<i))
k1+=k[i+1], b1+=b[i+1];
t=(s1-b1)/k1;
//cout<<"t: "<<t<<' '<<bitset<5>(s)<<endl;
if (ceil(t)>=-eps && k1*ceil(t)+b1>=s1-eps) ans=min(ans, (ll)ceil(t));
if (floor(t)>=-eps && k1*floor(t)+b1>=s1-eps) ans=min(ans, (ll)floor(t));
}
printf("%lld\n", ans);
exit(0);
}
}
namespace task1{
ll tem[N];
inline bool cmp(ll a, ll b) {return a>b;}
bool check(ll t) {
for (reg i=1; i<=n; ++i) tem[i]=k[i]*t+b[i];
sort(tem+1, tem+n+1, cmp);
ll sum=0;
for (reg i=1; i<=m; ++i)
if ((sum+=tem[i])>=s) return 1;
return 0;
}
void solve() {
ll l=0, r=(ll)(1e9), mid;
while (l<=r) {
mid=(l+r)>>1;
if (!check(mid)) l=mid+1;
else r=mid-1;
}
printf("%lld\n", l);
exit(0);
}
}
namespace task{
ll tem[N];
inline bool cmp(ll a, ll b) {return a>b;}
bool check(ll t) {
//cout<<"check "<<t<<endl;
for (reg i=1; i<=n; ++i) tem[i]=k[i]*t+b[i];
nth_element(tem+1, tem+m, tem+n+1, cmp);
//cout<<"tem: "; for (int i=1; i<=n; ++i) cout<<tem[i]<<' '; cout<<endl;
ll sum=0;
for (reg i=1; i<=m; ++i) if (tem[i]>0 && (sum+=tem[i])>=s) return 1;
return 0;
}
void solve() {
for (int i=1; i<=n; ++i) tem[i]=b[i];
sort(tem+1, tem+n+1, cmp);
ll sum=0;
for (reg i=1; i<=m; ++i) if ((sum+=tem[i])>=s) {puts("0"); exit(0);}
ll l=0, r=(ll)(1e9), mid;
while (l<=r) {
mid=(l+r)>>1;
if (!check(mid)) l=mid+1;
else r=mid-1;
}
printf("%lld\n", l);
exit(0);
}
}
signed main()
{
bool geq=1, leq=1;
n=read(); m=read(); s=read();
for (int i=1; i<=n; ++i) {
k[i]=read(); b[i]=read();
if (b[i]>=s) {puts("0"); return 0;}
if (k[i]>0) leq=0;
else if (k[i]<0) geq=0;
}
//if (n<=20) force::solve();
//else if (geq) task1::solve();
//else if (leq) {puts("0"); return 0;}
task::solve();
return 0;
}
题解 Merchant的更多相关文章
- [NOIP10.6模拟赛]1.merchant题解--思维+二分
题目链接: while(1)gugu(while(1)) 闲扯 考场上怕T2正解写挂其他两题没管只打了暴力,晚上发现这题思维挺妙的 同时想吐槽出题人似乎热衷卡常...我的巨大常数现在显露无疑QAQ 分 ...
- [最近公共祖先] POJ 3728 The merchant
The merchant Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4556 Accepted: 1576 Desc ...
- [POJ 3728]The merchant
Description There are N cities in a country, and there is one and only one simple path between each ...
- poj3728The merchant 【倍增】【LCA】
There are N cities in a country, and there is one and only one simple path between each pair of citi ...
- APIO2017伪题解
题目质量还是比较高的,只是当时澳大利亚方面出了一点问题?最后造成了区分度非常迷的局面. 纵观三道题,T1是披着交互外衣的提答题,T2是披着交互外衣的传统题,T3是一道据说近年来APIO最水的一道传统题 ...
- POJ3728The merchant (倍增)(LCA)(DP)(经典)(||并查集压缩路径?)
There are N cities in a country, and there is one and only one simple path between each pair of citi ...
- [CSP-S模拟测试]:Merchant(二分答案)
题目描述 有$n$个物品,第$i$个物品有两个属性$k_i,b_i$,表示它在时刻$x$的价值为$k_i\times x+b_i$.当前处于时刻$0$,你可以选择不超过$m$个物品,使得存在某个整数时 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
随机推荐
- Spring常见异常说明
文章要点 Spring bean 的声明方式 Spring bean 的注入规则 Spring bean 的依赖查找规则 Spring bean 的名称定义方式和默认名称规则 XXX required ...
- DHCP工作原理
DHCP:Dynamic Host Configurtion Protocol DHCP的工作原理(UDP) 1.客户端:首先会发送给一个dhcp discovery(广播)报文,报文中的2层和3层都 ...
- python exec()函数
''' 函数的作用: 动态执行python代码.也就是说exec可以执行复杂的python代码,而不像eval函数那样只能计算一个表达式的值. exec(source, globals=None, l ...
- 高校表白App-团队冲刺第十天
今天要做什么 做一个类似于淘宝的小云播报 做了什么 没有完全实现,轮转实现,功能没有 遇到的问题 遇到的问题好多啊,感觉写一天都写不完,我还是好好学习一下再重新写吧
- 「干货」面试官问我如何快速搜索10万个矩形?——我说RBush
「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当 ...
- 分享一个自己画div的技巧
分享一个自己画div的技巧 笔者是小白,前端不是很懂.现在想总结下自己画div布局的小技巧和思路. 先对着设计图把div给好好框选出来 我个人觉得这一步是很重要的,要先分析大局,再细节处理.一定要先决 ...
- pycharm基础使用入门
pycharm基础使用入门 输出 print函数 print('hello world') 右键选择run或者右上角的三角形运行,可以运行出结果 "E:\all sorts of learn ...
- Selenium3自动化测试【20】CSS定位元素
CSS 指层叠样式表 (CascadingStyleSheets),CSS一种用来表现HTML或XML等文件样式的计算机语言,其能够灵活的为页面提供丰富样式的风格. CSS使用选择器为页面元素绑定属性 ...
- 7.29考试总结(NOIP模拟27)[牛半仙的妹子图·Tree·序列]
前言 从思路上来讲是比较成功的,从分数上就比较令人失望了. 考场上是想到了前两个题的正解思路,其实最后一个题是半个原题,只可惜是我看不懂题... 这波呀,这波又是 语文素养限制OI水平.. 改题的时候 ...
- LinuxMint 19/Ubuntu 19.10重置开始菜单以及任务栏
====================== 问题:任务栏以及开始菜单弄不见了 解决方法: 快捷键打开终端,输入重置命令: dconf reset -f /