题目背景

自从迷上了拼图,JYY就变成了个彻底的宅男。为了解决温饱问题,JYY不得不依靠叫外卖来维持生计。

问题描述

外卖店一共有N种食物,分别有1到N编号。第i种食物有固定的价钱Pi和保质期Si。第i种食物会在Si天后过期。JYY是不会吃过期食物的。

比如JYY如果今天点了一份保质期为1天的食物,那么JYY必须在今天或者明天把这个食物吃掉,否则这个食物就再也不能吃了。保质期可以为0天,这样这份食物就必须在购买当天吃掉。

JYY现在有M块钱,每一次叫外卖需要额外付给送外卖小哥外送费F元。

送外卖的小哥身强力壮,可以瞬间给JYY带来任意多份食物。JYY想知道,在满足每天都能吃到至少一顿没过期的外卖的情况下,他可以最多宅多少天呢?

输入格式

第一行包含三个整数M,F和N。

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

输出格式

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

样例输入

32 5 2

5 0

10 2

样例输出

3

说明

【样例说明】

JYY的最佳策略是:

第一天买一份食物1和一份食物2并且吃一份食物1;

第二天吃一份食物2;

第三天买一份食物1并且吃掉。

【数据规模与约定】

对于100%的数据满足0<=Si<=1018,1<=F,Pi,M<=1018,1<=N<=200

解析

首先比较重要的是看出送外卖的次数和能够活的天数是一个单峰函数的关系。那么我们可以采用三分法求最大值。

现在的问题是如何已知送外卖的次数求能够活的最多的天数。考虑对每一次送外卖进行贪心,肯定是从最便宜的买起,能吃几天就吃几天,吃不了了就买次便宜的。这样我们最后肯定还剩了钱,即每次的余数。对于剩余的这部分我们用同样的方法来贪心,但不能作为单独的一次外卖。所以,我们从之前贪心时买到的外卖开始而不是从最便宜的开始。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#define int long long
#define N 202
using namespace std;
struct food{
int p,s;
}a[N];
int n,m,f,i;
int read()
{
char c=getchar();
int w=0;
while(c<'0'||c>'9') c=getchar();
while(c<='9'&&c>='0'){
w=w*10+c-'0';
c=getchar();
}
return w;
}
int my_comp(const food &x,const food &y)
{
if(x.p==y.p) return x.s>y.s;
return x.p<y.p;
}
int cal(int x)
{
int sum=m-x*f,ave=sum/x,rem=sum-ave*x,ans1=0,ans2=0,j=1;
for(int i=1;i<=n;i++){
if(a[i].s>=ans1&&ave>=a[i].p){
int tmp=min(a[i].s-ans1+1,ave/a[i].p);
ans1+=tmp;
ave-=tmp*a[i].p;
}
if(ave<a[i].p){
j=i;
break;
}
}
rem+=ave*x;
for(int i=j;i<=n;i++){
if(a[i].s>=ans1&&rem>=a[i].p){
ans2=min(rem/a[i].p,x);
break;
}
}
return ans1*x+ans2;
}
signed main()
{
m=read();f=read();n=read();
for(i=1;i<=n;i++) a[i].p=read(),a[i].s=read();
sort(a+1,a+n+1,my_comp);
int l=1,r,midl,midr;
if(f!=0) r=(m/f)+1;
else r=m+1;
while(l<r){
midl=l+(r-l)/3;
midr=r-(r-l)/3;
if(cal(midl)>=cal(midr)) r=midr-1;
else l=midl+1;
}
printf("%lld\n",cal(l));
return 0;
}

[洛谷P4040] AHOI2014 宅男计划的更多相关文章

  1. bzoj3874&2832 [Ahoi2014]宅男计划 模拟退火,三分

    [Ahoi2014&Jsoi2014]宅男计划 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 962  Solved: 371[Submit][ ...

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

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

  3. bzoj 3874: [Ahoi2014]宅男计划

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

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

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

  5. [BZOJ3874][AHOI2014] 宅男计划

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

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

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

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

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

  8. Bzoj 3874: [Ahoi2014&Jsoi2014]宅男计划 三分+贪心

    3874: [Ahoi2014&Jsoi2014]宅男计划 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 861  Solved: 336[Su ...

  9. 「AHOI2014/JSOI2014」宅男计划

    「AHOI2014/JSOI2014」宅男计划 传送门 我们首先要发现一个性质:存货天数随买食物的次数的变化类似于单峰函数. 具体证明不会啊,好像是二分加三分来证明?但是没有找到明确的严格证明. 感性 ...

随机推荐

  1. 重学 html の meta 标签

    参考链接: https://segmentfault.com/a/1190000019052062?utm_medium=hao.caibaojian.com&utm_source=hao.c ...

  2. Zebra架构与大数据架构优劣对比

    zebra架构的缺点 文件存储方式的缺点 1. 一个文件如果特别大,这样会造成存储的问题.一台机器的磁盘也不可能存储特别大的文件 2. 该文件在查询.删除.修改的时候都会存在问题 3. 如果文件太多, ...

  3. sqlalchemy基本的增删改查

    #encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String from sqlalchemy.ext.decl ...

  4. C++拷贝构造函数:浅拷贝与深拷贝

    在介绍C++浅拷贝与深拷贝之前,我们先引出C++的拷贝构造函数. C++拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用.用于在建立一个新的对象时,使用一个已经存在的对象来初始化这个新对象.因 ...

  5. 使用Python基于百度等OCR API的文字识别

    百度OCR Baidu OCR API:一定额度免费,目前是每日500次 Python SDK文档:https://cloud.baidu.com/doc/OCR/OCR-Python-SDK.htm ...

  6. redis 学习(4)-- 哈希类型

    redis 学习(4)-- 哈希类型 介绍 redis 中哈希键值结构: 可以看出:哈希键值包括 key,field,value 这三部分,即键,属性,值这三部分.可以这样来表示: key, (fie ...

  7. idea 修改pom文件jdk版本回退问题解决

    在Java开发是我们大多都使用集成开发环境,像idea和eclipse用的都比较多,在使用idea maven构建项目时,在修改pom.xml文件时,我们的项目jdk版本都会回退,还得每次去设置中修改 ...

  8. node工具之pm2

    pm2 PM2是带有内置负载平衡器的Node.js应用程序的生产过程管理器.它使您可以使应用程序永远保持活动状态,无需停机即可重新加载它们,并简化常见的系统管理任务. 安装 npm install p ...

  9. Brain的同步规则

    这段话来自Java编程思想并发一章 什么时候使用同步 如果你正在写一个变量,它可能接下来将被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么你必须使用同步,并且,读写线程都必须用 ...

  10. typeof,instanceof的区别,扩展知识:显示原型(prototype)与隐式类型(__protot__)

    3.typeof 和instanceof区别 1.typeof 主要用于判断对象类型 console.log(typeof null) //object console.log(typeof unde ...