正解:三分+贪心

解题报告:

传送门$QwQ$

其实很久以前的寒假就考过了,,,但那时候$gql$没有好好落实,就只写了个二分,并没有二分套三分,就只拿到了$70pts$

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,x,y) for(register ll i=x;i<=y;++i)
#define my(i,x,y) for(register ll i=x;i>=y;--i) const ll N=+;
ll m,f,n,p[N],s[N],mnv[N*],mxs,ans,sum[N*]; inline ll read()
{
char ch=getchar();ll x=;bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
void fd(ll v,ll tot)
{
ll l=,r=mxs;
while(l<r)
{
int mid=(l+r+)>>;
if((ll)sum[mid]*tot<=(ll)v)l=mid;
else r=mid-;
}
ans=max((ll)ans,l*tot+(v-sum[l]*tot)/mnv[l+]);
}
void work()
{
for(register ll i=f,tot=;i<=m;i+=f,++tot)fd(m-i,tot);
printf("%lld\n",ans);
} int main()
{
// freopen("food.in","r",stdin);
// freopen("food.out","w",stdout);
m=read();f=read();n=read();
memset(mnv,/,sizeof(mnv));mxs=ans=;
rp(i,,n){p[i]=read();s[i]=read()+;mnv[s[i]]=min(mnv[s[i]],p[i]);mxs=max(s[i],mxs);}
my(i,mxs-,)mnv[i]=min(mnv[i+],mnv[i]);rp(i,,mxs)sum[i]=sum[i-]+mnv[i];
if(f==){printf("%lld\n",m/mnv[]);return ;}work();
}

然后再套个三分就写完了$QwQ$

还是正儿八经写下题解趴$QwQ$(其实是从,考试总结蒯过来的$QwQ$

首先显然可以处理一下使得所有物品的花费是随保质期单调增的(单调栈或者直接排序其实都成的$QwQ$

然后枚举点了几轮外卖,就可以算出外卖费,就可以二分求出可以活几天

关于二分的正确性很容易证明

首先我们可以得出对于每一轮的最优天数一定是接近的

来我证明下

假如现在有两种方案

第一种是第一轮买$n$个第二轮买$n+100$个

第二种是第一轮买$n+50$个第二轮买$n+50$个

首先前$n$个吃的一定是一样的(显然是先吃花费低保质期低,这个不用证明趴,,,?

然后第一种第二轮的$n$个之后的那$50$个也一定是和第二种的$n$个之后的那$50$个是一样的

这样我们的比较就变成了剩下第一种第二轮$n+50$个之后的$50$个第二种第二轮$n$之后的$50$个

因为我们已经通过处理使得花费随保质期单调增了

所以买$n+50$个之后的$50$个一定花费不比$n$个之后的$50$个花费少

所以我们可以证明最优天数要么是$T$要么是$T+1$

所以我们就可以二分这个$T$,就欧克了

但是,如果在洛谷上做这道题这个方法就是过不去的了$QAQ$只有$70pts$(好像是$80pts$我写锅了$QwQ$

说下还要优化哪儿

就是,看一下上面的解法,会发现唯一可以优化的地方就是,我外卖的轮次是枚举的

怎么优化呢?三分法

可以证明,外卖的轮次与存活天数是个二次函数关系

来下面我再来证明下$QwQ$

首先如果不收钱,这就是个上凸函数.然后发现要钱了,就减去一个下凸函数

上凸减下凸依然是上凸,所以这是个上凸函数,可三分$QwQ$

然后之后的步骤就和上面那个$70pts$的是一样的辣!

(对了,,,实际应用是要用三分套二分做的$QwQ$.因为二分套三分会爆$ll$好像$kk$

然后因为三分套二分真的很麻烦$kk$

所以我写的三分加贪心$QwQ$

三分加贪心就很$easy$了?三分出外卖的轮数之后先把所有钱减去外卖费用,然后从小往大看每个食物能放多少天,能放就放,$over$

然后还有就是因为它都贼大所以有一个地方会爆$ll$,,,我的解决方法是把一个数移到右边去除就成$QwQ$,或者写个$lf$快速乘一样的也行$QwQ$

$over$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ll long long
#define int long long
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define lb(x) lower_bound(st+1,st+st_cnt+1,x)-st const ll N=+;
ll m,f,n,as;
struct node{ll p,s;}nod[N]; il ll read()
{
rc ch=gc;ll x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il bool cmp(node gd,node gs){return gd.p<gs.p;}
il ll cal(ll tim)
{
ll mon=m-1ll*tim*f,dat=,ret=;if(mon<=)return ;
rp(i,,n)
{
ri t=nod[i].s-dat;if(t<=)continue;
if(1ll*nod[i].p*t<=mon/tim)ret+=tim*t,mon-=1ll*nod[i].p*tim*t,dat=nod[i].s;
else return ret+mon/nod[i].p;
}
return ret;
} signed main()
{
//freopen("4040.in","r",stdin);freopen("4040.out","w",stdout);
m=read();f=read();n=read();rp(i,,n)nod[i]=(node){read(),read()+};sort(nod+,nod++n,cmp);
ll l=,r=m/f;
while(r-l>=)
{
ll midl=((l<<)+r)/,midr=(l+(r<<))/,asl=cal(midl),asr=cal(midr);
if(asl<=asr)l=midl;;if(asl>=asr)r=midr;
}
rp(i,l,r)as=max(as,cal(i));;printf("%lld\n",as);
return ;
}

洛谷$P4040\ [AHOI2014/JSOI2014]$宅男计划 贪心的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 「AHOI2014/JSOI2014」宅男计划

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

随机推荐

  1. Python从文件中读取内容,包含中文和英文

    读取文件内容使要和保存文件时的格式一致 以UTF-8格式保存文件,如: 读取: 在.py起始行写入:#-*- coding:utf-8 -*- filename = raw_input(u" ...

  2. python---异常处理与反射

    一.异常处理 1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! try: pass except ...

  3. hdu 4128 Running relay (线性规划转半平面交)

    Problem - 4128 对偶线性规划转半平面交,这题的正解O(nlogn)解法,目前网上没有找到这样的正解. 原来的不等式组, sigma{-si*xi}>=-W+d*sigma{si} ...

  4. js中setInterval与setTimeout用法 实现实时刷新每秒刷新

    setTimeout 定义和用法:  setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式.     语法:  setTimeout(code,millisec)     参数:    ...

  5. windows 和 linux 安装 tensorflow

    安装 跟往常一样,我们用 Conda 来安装 TensorFlow.你也许已经有了一个 TensorFlow 环境,但要确保你安装了所有必要的包. OS X 或 Linux 运行下列命令来配置开发环境 ...

  6. Redis源码解析:04字典的遍历dictScan

    dict.c中的dictScan函数,用来遍历字典,迭代其中的每个元素.该函数使用的算法非常精妙!!!所以必须记录一下. 遍历一个稳定的字典,当然不是什么难事,但Redis中的字典因为有rehash的 ...

  7. 【SDOI2015】bzoj3990 排序

    A. 排序 题目描述 输入格式 输出格式 一行,一个整数,表示可以将数组A从小到大排序的不同的操作序列的个数. 样例 样例输入 3 7 8 5 6 1 2 4 3 样例输出 6 数据范围与提示 对于3 ...

  8. 虎牙在全球 DNS 秒级生效上的实践

    本文整理自虎牙中间件团队在 Nacos Meetup 的现场分享,阿里巴巴中间件受权发布. 这次分享的是全球 DNS 秒级生效在虎牙的实践,以及由此产生的一些思考,整体上,分为以下5各部分: 背景介绍 ...

  9. hdu 3982 Harry Potter and J.K.Rowling (半平面交 + 圆与多边形交)

    Problem - 3982 题意就是给出一个圆心在原点半径为R的圆形蛋糕,上面有一个cherry,对蛋糕切若干刀,最后要求求出有cherry的那块的面积占整个蛋糕的多少. 做法显而易见,就是一个半平 ...

  10. PHP利用纯真IP数据库在本地实现IP地址信息查询

    https://blog.csdn.net/myweishanli/article/details/45098693 准备工作: 建议本地IP地址数据库,请到http://www.cz88.net/这 ...