题目背景

自从迷上了拼图,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. 轻度折腾nuc8i5beh

    最近入手了一台迷你电脑:Intel NUC--Next Unit of Computing,配了1根16GB内存条(2666)和两块固态(m.2+sata),搭载i5-8259U ,Intel Iri ...

  2. 【机器学习】Learning to Rank 简介

    Learning to Rank 简介 去年实习时,因为项目需要,接触了一下Learning to Rank(以下简称L2R),感觉很有意思,也有很大的应用价值.L2R将机器学习的技术很好的应用到了排 ...

  3. weiphp记录

    jae 上传必须包括这2个文件,不然又会重新安装 标志文件有两个:Application/Install/Data/install.lockApplication/User/Conf/config.p ...

  4. 再谈mysql锁机制及原理—锁的诠释

    加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...

  5. flask add_url_rule的使用

    from flask import Flask,url_for #url_for 接受两个参数(endpoint,**value)endpoint没有指定就是默认的函数名,根据 view_func._ ...

  6. 设计模式:状态模式(Status)

    在介绍状态模式之前,我们先来看这样一个实例:你公司力排万难终于获得某个酒店的系统开发项目,并且最终落到了你的头上.下图是他们系统的主要工作(够简单). 当你第一眼看到这个系统的时候你就看出来了这是一个 ...

  7. # 江西ccpc省赛-waves-(DP做法)

    江西ccpc省赛-waves-(DP做法) 题链:http://acm.hdu.edu.cn/showproblem.php?pid=6570 题意:给你长度为N,1≤N≤100000的一个数组,其中 ...

  8. Laravel-admin 表单提交同时验证俩个以上的字段唯一值

    $name = isset(request()->all()['name']) ? request()->all()['name'] : ''; $id = isset(request() ...

  9. tensorflow 使用tfrecords创建自己数据集

    直接采用矩阵方式建立数据集见:https://www.cnblogs.com/WSX1994/p/10128338.html 制作自己的数据集(使用tfrecords) 为什么采用这个格式? TFRe ...

  10. 部署master节点组件

    部署master节点组件 master节点的组件有:kube-apiserver,kube-scheduler,kube-controller-manager 大致安装步骤如下: # mkdir -p ...