题解 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 ...
随机推荐
- 『无为则无心』Python函数 — 28、Python函数的简单应用
目录 1.函数嵌套调用 2.Python函数的简单应用 (1)打印线条 (2)函数计算 (3)打印图形 3.函数的说明文档 (1)函数的说明文档的作用 (2)函数说明文档的语法 (3)查看函数的说明文 ...
- interpration
On interpreting the effects of repetition interpreting 释意1. If you interpret something in a particul ...
- 「BZOJ2839」集合计数
「BZOJ2839」集合计数 题目大意: 一个包含 \(n\) 个数的集合有 \(2^n\) 个子集,从这些子集中取出若干个集合(至少一个),使他们的交集的元素个数恰好为 \(k\),求方案数,答案对 ...
- celery task异步任务
业务端后台:通过python manage运行 运行用例时,用python manage运行时会卡,影响效率 celery task 本身自己也是个服务,异步处理case 异步:小明去给我买个东西,我 ...
- C语言:延时1秒
使用sleep()函数将程序阻塞,头文件在windows系统和linux系统下是不一样的windowsSleep()//第一个字母大写#include <windows.h>函数原型voi ...
- Git初始化本地已有项目
1.初始化仓库 git init 2.remote git remote add origin 仓库地址 3.从远程分支拉取master分支并与本地master分支合并 git pull origin ...
- Jmeter性能测试指标分析
一.Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为"聚合报告 如果大家都是做Web应用的性能测试,例如访问百度请求为例,线程10,循环10次, ...
- springboot-2-IOC容器的基本注解
@Configuration 告诉springboot这是一个配置类,用于补充IOC容器, 示例: @Configuration //告诉springboot这是一个配置类,作为IOC容器的自定义补充 ...
- 跨域jsonp+jQuery+json+html动态生成表格
1.什么是跨域 浏览器对于javascript的同源策略的限制,例如a.cn下面的js不能调用b.cn中的js,对象或数据(因为a.cn和b.cn是不同域),所以跨域就出现了. 凡是拥有scr这个属性 ...
- Python基础之用PyQt5创建menu
前一篇文章中,我们已经安装了PyQt5,并且已经测试过可用.那么接下来第一步开始学习如何创建菜单. 第一步:在想要运行py的地方右击External Tools-->designer,打开des ...