3874: [Ahoi2014&Jsoi2014]宅男计划

Time Limit: 1 Sec  Memory Limit: 256 MB
Submit: 861  Solved: 336
[Submit][Status][Discuss]

Description

 【故事背景】
自从迷上了拼图,JYY就变成了个彻底的宅男。为了解决温饱问题,JYY
不得不依靠叫外卖来维持生计。
【问题描述】
外卖店一共有N种食物,分别有1到N编号。第i种食物有固定的价钱Pi和保质期Si。第i种食物会在Si天后过期。JYY是不会吃过期食物的。
比如JYY如果今天点了一份保质期为1天的食物,那么JYY必须在今天或
者明天把这个食物吃掉,否则这个食物就再也不能吃了。保质期可以为0天,这
样这份食物就必须在购买当天吃掉。
JYY现在有M块钱,每一次叫外卖需要额外付给送外卖小哥外送费F元。
送外卖的小哥身强力壮,可以瞬间给JYY带来任意多份食物。JYY想知道,在
满足每天都能吃到至少一顿没过期的外卖的情况下,他可以最多宅多少天呢?
 

Input

第一行包含三个整数M,F和N。
接下来N行,第i行包含两个整数Pi和Si。

Output

输出仅包含一行一个整数表示JYY可以宅的最多的天数。

 

Sample Input

32 5 2
5 0
10 2

Sample Output

3

HINT

【样例说明】

JYY的最佳策略是:
第一天买一份食物1和一份食物2并且吃一份食物1;
第二天吃一份食物2;
第三天买一份食物1并且吃掉。
 
【数据规模与约定】
对于100%的数据满足0<=Si<=10^18,1<=F,Pi,M<=10^18,1<=N<=200
 
  当时还以为是一个动归题,想半天想不出来,直接跪了。一看题解 三分??!!
  好吧,我之前貌似就打过一次三分,还打挂了,从此以后再也没去打过,讲解也只是听stdafx学长讲过,都忘的差不多了,所以赶紧打一道压压惊。
  众所周知三分主要运用在单峰函数上,但这道题为什么是单峰函数呢?据出题人说他只是想让大家去猜,至于证明,网上我只找到一份,还无法访问……那我就口胡了。
  假设不考虑保质期,那么外卖小哥一定是来的越少越好。同理,如果外卖小哥不要钱,那么我们买的越便宜越好,所以,这两者相互牵绊,我们如果叫太多次外卖我们就不得不去用更少的钱去买吃的,而如果我们买太少次外卖,保质期长的往往要贵一些,我们可能会买太多太贵的东西。所以应该有那么一个中间值是最好的。中庸之道?
  首先,我们一定要去贪心去掉那些又贵还容易过期的。然后重新构造出所有食品,然后套三分check。
  假设我们已经知道当前要check的买外卖的次数,那么我们可以将所有食品按照价格从小到大重新排序,然后依次枚举,我们可以想到,为了多宅一会,我们每次买外卖的钱一定是尽可能接近甚至相等的,那我们就可以对于一个物品分两种讨论。第一,我们每一次买外卖我们都让小哥带一份来,这个在容易不过,只要注意保质期的限制就好了。第二,也是较难的,散着买,我们买了东西后很有可能会有剩余的钱,够买一些吃的却买不了一个周期,这时,我们就要去判断我们是否能够去把它加到一些区间里去,让这些钱物尽其用。首先,判断条件依然是保质期,不过由于我们已经无法再买一个周期,我们能买的份数就是现有钱数/价格。而这些散着买的物品对于周期的贡献也是要记为1的。有的人可能会像我一样,疑惑这会不会对之后我们散着买的食品造成影响。
  当然不会,我们假设后面有一种食品可以被填补在当前并未分配到我们散着买食品的区间中,但由于我们T++,无法被放入,那么我们想一想,之前我们散着购买食品的时候为什么没有给这个区间也买上食品呢?因为钱已经不够花了,而我们又是将物品按照价格排的序,因此这种情况根本不会存在。
 #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#define N 205
using namespace std;
long long n,m,f,zz,ans;
struct no
{
long long p,s;
}node2[N],node[N];
bool px(no a,no b)
{
if(a.s==b.s)return a.p<b.p;
return a.s>b.s;
}
bool px2(no a,no b)
{
return a.p<b.p;
}
long long check(long long x)
{
long long money=m-f*x,T=,sum=,js;
if(money<)return ;
for(int i=;i<=n;i++)
{
if(T<node[i].s)
{
js=min(node[i].s-T,money/(x*node[i].p));
sum+=x*js;
T+=js;
money-=node[i].p*js*x;
}
if(T<node[i].s)
{
js=money/node[i].p;
sum+=js;
T++;
money-=node[i].p*js;
}
}
return sum;
}
int main()
{
scanf("%lld%lld%lld",&m,&f,&n);
for(int i=;i<=n;i++)
{
scanf("%lld%lld",&node2[i].p,&node2[i].s);
node2[i].s++;
}
sort(node2+,node2++n,px);
node[]=node2[];zz=; for(int i=;i<=n;i++)
{
if(node2[i].p>=node2[i-].p)continue;
zz++;
node[zz]=node2[i];
}
n=zz;
sort(node+,node++n,px2);
long long li=,ri=m/(f+node[].p),lm,rm;
while(li<=ri)
{
lm=li+(ri-li+)/,rm=ri-(ri-li+)/;
long long ans1=check(lm),ans2=check(rm);
if(ans1>=ans2)
{
ans=max(ans,ans1);
ri=rm-;
}
else
{
ans=max(ans,ans2);
li=lm+;
}
}
printf("%lld\n",ans);
return ;
}

Bzoj 3874: [Ahoi2014&Jsoi2014]宅男计划 三分+贪心的更多相关文章

  1. bzoj 3874: [Ahoi2014&Jsoi2014]宅男计划

    Description 外卖店一共有N种食物,分别有1到N编号.第i种食物有固定的价钱Pi和保质期Si.第i种食物会在Si天后过期.JYY是不会吃过期食物的. 比如JYY如果今天点了一份保质期为1天的 ...

  2. [luogu] P4040 [AHOI2014/JSOI2014]宅男计划(贪心)

    P4040 [AHOI2014/JSOI2014]宅男计划 题目背景 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY不得不依靠叫外卖来维持生计. 题目描述 外卖店一共有N种食物, ...

  3. 【BZOJ3874】[AHOI&JSOI2014]宅男计划(贪心,三分)

    [BZOJ3874][AHOI&JSOI2014]宅男计划(贪心,三分) 题面 BZOJ 洛谷 题解 大力猜想一最长的天数和购买外卖的总次数是单峰的.感性理解一下就是买\(0\)次是\(0\) ...

  4. BZOJ3874:[AHOI2014&JSOI2014]宅男计划(爬山法)

    Description  [故事背景] 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY 不得不依靠叫外卖来维持生计. [问题描述] 外卖店一共有N种食物,分别有1到N编号.第i种 ...

  5. 洛谷$P4040\ [AHOI2014/JSOI2014]$宅男计划 贪心

    正解:三分+贪心 解题报告: 传送门$QwQ$ 其实很久以前的寒假就考过了,,,但那时候$gql$没有好好落实,就只写了个二分,并没有二分套三分,就只拿到了$70pts$ #include <b ...

  6. food(洛谷P4040 [AHOI2014/JSOI2014]宅男计划)

    题目在这里 题目描述 外卖店一共有N种食物,分别有1到N编号.第i种食物有固定的价钱Pi和保质期Si.第i种食物会在Si天后过期.JYY是不会吃过期食物的. 比如JYY如果今天点了一份保质期为1天的食 ...

  7. Luogu P4040 [AHOI2014/JSOI2014]宅男计划

    题目 显然存活天数与叫外卖次数的函数是凸函数. 所以三分买外卖的次数. 然后把食品按保质期升序排序. 并且单调栈搞一下,把又贵又保质期短的丢掉. 那么随着保质期的增加,食品的价格一定上涨. 所以我们从 ...

  8. 外卖(food) & 洛谷4040宅男计划 三分套二分&贪心

    food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久.    外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 Si ...

  9. Luogu4040 AHOI/JSOI2014 宅男计划 贪心、二分、三分

    传送门 仍然对"为什么这个函数单峰"的问题毫无理解 首先,对于保质期又低.价格又贵的食物,我们显然不需要购买它.所以如果设\(pri_i\)表示保质期不小于\(i\)的所有食品中价 ...

随机推荐

  1. 前端PS常用切图技巧

    前言:前端涉及到的 ps 操作不算复杂,基本上就是切图,本文总结了常用的几种切图技巧. 工具:photoshop cs6 . photoshop cc 1. 传统切图 01 这是最笨的一种方法,核心就 ...

  2. Linux ssh密钥自动登录 专题

    在开发中,经常需要从一台主机ssh登陆到另一台主机去,每次都需要输一次login/Password,很繁琐.使用密钥登陆就可以不用输入用户名和密码了 实现从主机A免密码登陆到主机B(即把主机A的pub ...

  3. BGP的一网双平面规划

    网络拓扑: XRV1 ===================================================================== # sysname XRV1# boa ...

  4. Win10版《芒果TV》全平台直播第89届奥斯卡颁奖典礼,特设第二演播室带来一手资讯

    芒果TV为所有中国影迷们带来的:今年的奥斯卡直播与往年格外不同,为了让网友们观看这场盛典得到多维度体验,不管是来看热闹的还是看门道的都看得开心尽兴,芒果TV特设第二演播室,为大家带来第一手新鲜热辣的现 ...

  5. 程序异常崩溃后用windbg辅助调试解决的经验 以及 堆栈问题调试经验

    1,程序异常崩溃后用windbg辅助调试解决的经验  状况:我的程序调用别人的库做 文件写入工作. 在这一过程中出现异常,程序崩溃. 经反复检查,认为自己的程序没有错,但无法判断在别人库里哪里有错. ...

  6. UWP开发学习笔记1

    导航到页面: this.Frame.Navigate(typeof(SecondPage)); 导航进入当前页面时会调用OnNavigatedTo方法:导航从当前页面离开时会调用OnNavigatin ...

  7. PHP阿里大鱼短信验证

    PHP阿里大鱼短信验证 第一步 登陆阿里大于注册账号,在用户管理中心创建应用,确定AppKEY和App Secret还有配置签名 第二步 在应用管理中选择SDK下载,或者直接点击http://down ...

  8. SYN011型 B码时统

       SYN011型 B码时统 产品概述 SYN011型B码时统是由西安同步电子科技有限公司精心设计.自行研发生产的一款专用时统设备,从GPS/北斗卫星上/和外部输入的IRIG-B码获取标准时钟信号信 ...

  9. 零基础搭建appium自动化环境

    目录 1.关键概念 2.安装过程 2.1.安装nodejs 2.2.安装appium 2.3.安装Android SDK 2.4.安装模拟器 2.5.安装Python3 2.6.安装appium Cl ...

  10. 解决安装Oracle本地可以访问客户端不能访问

    现象:本地需要修改监听为localhost -->win+r--> sqlplus system/123@xxdb 可以登陆,远程客户端不能登陆:需要将监听修改为IP地址,重启监听:远程可 ...