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++,无法被放入,那么我们想一想,之前我们散着购买食品的时候为什么没有给这个区间也买上食品呢?因为钱已经不够花了,而我们又是将物品按照价格排的序,因此这种情况根本不会存在。
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <queue>
  6. #include <algorithm>
  7. #include <cmath>
  8. #include <map>
  9. #include <set>
  10. #define N 205
  11. using namespace std;
  12. long long n,m,f,zz,ans;
  13. struct no
  14. {
  15. long long p,s;
  16. }node2[N],node[N];
  17. bool px(no a,no b)
  18. {
  19. if(a.s==b.s)return a.p<b.p;
  20. return a.s>b.s;
  21. }
  22. bool px2(no a,no b)
  23. {
  24. return a.p<b.p;
  25. }
  26. long long check(long long x)
  27. {
  28. long long money=m-f*x,T=,sum=,js;
  29. if(money<)return ;
  30. for(int i=;i<=n;i++)
  31. {
  32. if(T<node[i].s)
  33. {
  34. js=min(node[i].s-T,money/(x*node[i].p));
  35. sum+=x*js;
  36. T+=js;
  37. money-=node[i].p*js*x;
  38. }
  39. if(T<node[i].s)
  40. {
  41. js=money/node[i].p;
  42. sum+=js;
  43. T++;
  44. money-=node[i].p*js;
  45. }
  46. }
  47. return sum;
  48. }
  49. int main()
  50. {
  51. scanf("%lld%lld%lld",&m,&f,&n);
  52. for(int i=;i<=n;i++)
  53. {
  54. scanf("%lld%lld",&node2[i].p,&node2[i].s);
  55. node2[i].s++;
  56. }
  57. sort(node2+,node2++n,px);
  58. node[]=node2[];zz=;
  59.  
  60. for(int i=;i<=n;i++)
  61. {
  62. if(node2[i].p>=node2[i-].p)continue;
  63. zz++;
  64. node[zz]=node2[i];
  65. }
  66. n=zz;
  67. sort(node+,node++n,px2);
  68. long long li=,ri=m/(f+node[].p),lm,rm;
  69. while(li<=ri)
  70. {
  71. lm=li+(ri-li+)/,rm=ri-(ri-li+)/;
  72. long long ans1=check(lm),ans2=check(rm);
  73. if(ans1>=ans2)
  74. {
  75. ans=max(ans,ans1);
  76. ri=rm-;
  77. }
  78. else
  79. {
  80. ans=max(ans,ans2);
  81. li=lm+;
  82. }
  83. }
  84. printf("%lld\n",ans);
  85. return ;
  86. }

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. linux自动挂载远程网盘到本地

    sudo vim /etc/fstab  添加如下内容 //192.168.1.110/MyFiles /path/to/mount cifs username=adminz,password=pas ...

  2. 蚂蚁金服招聘-JAVA资深开发工程师/专家-蚂蚁金服保险

    岗位描述: 1.协助业务方梳理业务需求,提供业务规划方案.架构设计方案: 2.负责业务系统的规划设计,制定产品的技术发展路线,完成重要业务模块及核心框架的搭建及编码实现: 3.发现和解决业务系统的技术 ...

  3. Android零基础入门第59节:AnalogClock、DigitalClock和TextClock时钟组件

    原文:Android零基础入门第59节:AnalogClock.DigitalClock和TextClock时钟组件 在前面一期,我们学习了DatePicker和TimePicker,在实际开发中其不 ...

  4. IP解析

    import sys,re ip_1_stat = {} source_fp = open("ip_region","r") p = re.compile(&q ...

  5. Bigtable:结构化数据的分布式存储系统

    Bigtable最初是谷歌设计用来存储大规模结构化数据的分布式系统,其可以在数以千计的商用服务器上存储高达PB级别的数据量.开源社区根据Bigtable的设计思路开发了HBase.其优势在于提供了高效 ...

  6. Qt:移动无边框窗体(使用Windows的SendMessage)

    移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 void EditDialog::mousePressEvent(QMouseEv ...

  7. 使用SpringMVC框架解决中文乱码的问题

    spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解决POST方式造成的中文乱码 问题. 需要在we ...

  8. Silverlight消散,WinRT登台

    2011年,Silverlight刚开始有蓬勃发展的起色,不利的传言就开始大量流传.不安的Silverlight开发者们要求微软澄清,但得到的只是沉默.终于随着微软在BUILD上亮相Window 8以 ...

  9. WPF四年,尤不足以替代WinForm

    WPF四年,尤不足以替代WinForm WPF出山已四年,作为官方内定的下一代UI系统掌门,没少露脸.但这个新掌门能否胜任,仍是众多开发者的心头之虑.通过对VisualStudio 2010的编辑器部 ...

  10. linux-deployment

    官方 linux-deploymenthttp://doc.qt.io/qt-5/linux-deployment.html linuxdeployqthttps://github.com/probo ...