传送门

可以发现如果我们最终选择的物品集合已经确定,就很好求了

\(\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的更多相关文章

  1. [NOIP10.6模拟赛]1.merchant题解--思维+二分

    题目链接: while(1)gugu(while(1)) 闲扯 考场上怕T2正解写挂其他两题没管只打了暴力,晚上发现这题思维挺妙的 同时想吐槽出题人似乎热衷卡常...我的巨大常数现在显露无疑QAQ 分 ...

  2. [最近公共祖先] POJ 3728 The merchant

    The merchant Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4556   Accepted: 1576 Desc ...

  3. [POJ 3728]The merchant

    Description There are N cities in a country, and there is one and only one simple path between each ...

  4. poj3728The merchant 【倍增】【LCA】

    There are N cities in a country, and there is one and only one simple path between each pair of citi ...

  5. APIO2017伪题解

    题目质量还是比较高的,只是当时澳大利亚方面出了一点问题?最后造成了区分度非常迷的局面. 纵观三道题,T1是披着交互外衣的提答题,T2是披着交互外衣的传统题,T3是一道据说近年来APIO最水的一道传统题 ...

  6. 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 ...

  7. [CSP-S模拟测试]:Merchant(二分答案)

    题目描述 有$n$个物品,第$i$个物品有两个属性$k_i,b_i$,表示它在时刻$x$的价值为$k_i\times x+b_i$.当前处于时刻$0$,你可以选择不超过$m$个物品,使得存在某个整数时 ...

  8. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  9. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

随机推荐

  1. 深入理解Java容器——HashMap

    目录 存储结构 初始化 put resize 树化 get 为什么equals和hashCode要同时重写? 为何HashMap的数组长度一定是2的次幂? 线程安全 参考 存储结构 JDK1.8前是数 ...

  2. React组件三大属性之 props

    React组件三大属性之 props 理解1) 每个组件对象都会有props(properties的简写)属性2) 组件标签的所有属性都保存在props中 作用1) 通过标签属性从组件外向组件内传递变 ...

  3. Leetcode2.两数相加——简洁易懂

    > 简洁易懂讲清原理,讲不清你来打我~ 输入两个链表,相同位置相加,进位给下一个位置,输出相加后的链表![在这里插入图片描述](https://img-blog.csdnimg.cn/f43b7 ...

  4. Docker编排利器DockerCompose

    Docker 编排利器 DockerCompose,编排之后可以一次性通过一条命令启动一组服务 例如一条命令启动 SpringBoot 项目,同时启动 SpringBoot 项目依赖的其他中间件(My ...

  5. PAT乙级:1076 Wifi密码 (15分)

    PAT乙级:1076 Wifi密码 (15分) 题干 下面是微博上流传的一张照片:"各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题 ...

  6. CentOS下 Django部署 nginx+uWSGI+Django(二)

    该篇内容承接CentOS下 Django部署 uWSGI+Django(一),细节流程可参考此篇内容. 1. 当前系统 CentOS Linux release 7.6.1810 Python 2.7 ...

  7. 类似express的路由封装方式

    1.原理 主要过程涉及三个元素的定义,如下: //用于承载一系列方法的对象 var funObj = {}; //用于根据条件执行funObj中的方法 var app = function(){}; ...

  8. 并发队列ConcurrentLinkedQueue与LinkedBlockingQueue源码分析与对比

    目录 前言 ConcurrentLinkedQueue 使用方法 存储结构 初始化 入队 出队 获取容器元素数量 LinkedBlockingQueue 使用方法 存储结构 初始化 入队 出队 获取容 ...

  9. 打开随身U盘_办公专用盘 2019年11月29日

    ;;; ; 打开随身U盘_办公专用盘 2019年11月29日 ; https://www.autoahk.com/?p=16553; https://www.cnblogs.com/delphixx/ ...

  10. [JS]异步任务之事件循环

    前言 常常会听到单线程和多线程这两个名词,单线程即一个时间段内程序从上到下执行任务,多线程即一个时间段内程序同时执行多个任务. 然而 JavaScript 是单线程的,它不像 Java 那样新开启一个 ...