传送门

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

\(\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. 查找----python

    class Solution: #顺序查找 def seq_search(self,list,num): for i in(range(len(list))): if list[i] == num: ...

  2. Jmeter常见报错信息: ERROR - jmeter.protocol.http.proxy.ProxyControl: Could not initialise key store java.io.IOException: Cannot run program "keytool"

    JMeter 2.10 用的新方法来录制HTTPS请求Java 7. 录制的过程中会碰到一些问题或者报错,就目前碰到的,做出一些总结. ERROR - jmeter.protocol.http.pro ...

  3. C语言:变量定义

    变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义.变量声明:用于向程序表明变量的类型和名字.定义也是声明,extern声明不是定义 定义也是声明:当定义变量时我们声 ...

  4. vue实现menu菜单懒加载

    本文将在vue+element ui项目中简单实现menu菜单的懒加载. 最近接到这样的需求:菜单的选项不要固定的,而是下一级菜单选项需要根据上级菜单调接口来获取.what? 这不就是懒加载吗?翻了一 ...

  5. Echarts入门踩坑记录

    关于Echarts,官网上,是这样介绍的,"Echarts,一个使用JavaScript实现的开源可视化库",也就是说,在使用过程中,将其作为普通的JavaScript组件库使用即 ...

  6. 42 张图带你撸完 MySQL 优化

    Hey guys,这里是程序员cxuan,欢迎你阅读我最新一期的文章,这篇文章是 MySQL 调优的汇总版,我加了一下日常开发过程中的调优经验,希望对各位小伙伴们有所帮助.下面开始正文. 一般传统互联 ...

  7. Java 比较两个Word文档差异

    本文介绍使用Spire.Doc for Java的比较功能来比较两个相似Word文档的差异.需要使用的版本为3.8.8或者后续发布的新版本.可下载jar包,解压将lib文件夹下的Spire.doc.j ...

  8. CSS居中对齐终极指南

    本文首发于我的公众号:前端新世界 欢迎关注 本文将讨论可用于居中对齐元素的6种CSS技术(按照最佳实践排序),以及每一种技术最适合应用的场景.这里,居中对齐指的是将元素放置在其父元素的水平和垂直中心. ...

  9. PphpStorm常用操作整理

    本地修改记录:在项目名称上右键,点击Local History | Show History.你可以看到项目文件各个历史版本:Alt+Shift+C,可以看到项目最近的修改.这就是它的版本集成功能特性 ...

  10. node.js背后的引擎V8及优化技术

    本文将挖掘V8引擎在其它方面的代码优化,如何写出高性能的代码,及V8的性能诊断工具.V8是chrome背后的javascript引擎,因此本文的相关优化经验也适用于基于chrome浏览器的javasc ...