Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 124  Solved: 26

Description

众所周知,小C是个宅男,所以他的每天的食物要靠外卖来解决。小C现在有M元钱,他想知道这些钱他最多可以吃多少天。

餐厅提供N种食物,每种食物有两个属性,单价Pi和保质期Si,表示小C需要花Pi元才能买到足够一天吃的这种食物,并且需要在送到Si天内吃完,否则食物会变质,就不能吃了,若Si为0则意味着必须在送到当天吃完。另外,每次送餐需要额外F元送餐费。

Input

每个测试点包含多组测试数据;
每个测试数据第一行三个整数M,F,N,如题目描述中所述;
以下N行,每行两个整数,分别表示PiSi

Output

对于每个测试数据输出一行,表示最多可以吃的天数。

Sample Input

32 5 2
5 0
10 2
10 10 1
10 10
10 1 1
1 5

Sample Output

3
0
8

HINT

【数据规模及约定】

对于40%的数据,M,Si <= 2*10^6;

对于100%的数据,M, Si<= 10^18,1 ≤ T ≤ 50,1 ≤ F ≤ M,1 ≤ N ≤ 200,1 ≤ Pi ≤ M。

Source

死宅真恶心(嫌弃脸)

嗯?你问我的博客背景?

……那是我朋友们的照片啊,怎么就和四斋扯上关系了?(不满)

双倍经验。3874的数据比2832弱得多。

数学问题(?) 三分法 贪心

首先去掉那些没用的食物(比某种食物更贵且保质期更短)。

看到最多天数,不妨试试二分。然而二分并不会做,随意脑洞一下发现这应该是个单峰函数,可以三分答案。

因为食物可以重复买,每次买的最优决策肯定是一样的,可以放在一起处理。

三分购买的次数lim,check此时的花费,将食物按价格从小到大排序,在保质期内贪心购买,如果保质期不够了,就换用更贵但更持♂久的食物,看最多能撑多少天。

在解决了几个NC错误和一个爆int错误以后成功A掉了3874

然而在2832WA掉了。

discuss里说这并不是一个严格的单峰函数,在逼近极值的时候函数曲线可能会有波动,如果将剩余钱数作为第二关键字,就是严格的单峰函数了。

虽然不是很懂,但是姑且照这么写了,可以过。

看到网上还有三分+模拟退火的写法,不由感叹随机大法好

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
const int mxn=;
LL read(){
LL x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
LL M,F;
int n,cnt=;
struct fd{
LL p,s;
bool operator < (const fd &b)const{
return p<b.p;
}
}a[mxn];
LL check(LL lim,LL &left){
LL res=,now=;
if(F*lim>=M){left=;return ;}
left=M-F*lim;
for(int i=;i<=n;i++){
if(a[i].s>=now){//lim次都买
LL tmp=min(a[i].s-now+,left/(a[i].p*lim));//可以买的天数*lim
now+=tmp;//单次生存天数
res+=tmp*lim;//总生存天数
left-=a[i].p*tmp*lim;
}
if(a[i].s>=now){//零买
LL tmp=min((LL)lim,left/a[i].p);
++now;
res+=tmp;
left-=a[i].p*tmp;
}
if(left<a[i].p)break;
}
return res;
}
void solve(){
LL l=,r=M/(F+a[].p),L1,L2;
LL ans=;
while(l<=r){
LL mL=l+(r-l)/; LL mR=r-mL+l;
LL tmp1=check(mL,L1),tmp2=check(mR,L2);
bool side=;
if(tmp1==tmp2 && L1==L2){
ans=max(ans,tmp1);l=mL+;r=mR-;
}
if(tmp1==tmp2)
side=(L1>=L2);
else side=(tmp1<tmp2);
if(side)l=mL+;
else r=mR-;
ans=max(ans,max(tmp1,tmp2));
}
printf("%lld\n",ans);
return;
}
int main(){
int i,j;
while(scanf("%lld%lld%d",&M,&F,&n)!=EOF){
for(i=;i<=n;i++){
a[i].p=read(); a[i].s=read();
}
cnt=;
for(i=;i<=n;i++){
for(j=;j<=n;j++)
if(i!=j && a[i].p>=a[j].p && a[i].s<=a[j].s)break;
if(j>n)a[++cnt]=a[i];
}
n=cnt;
sort(a+,a+n+);
solve();
}
return ;
}

Bzoj2832 / Bzoj3874 宅男小C的更多相关文章

  1. 【BZOJ2832&&3874】宅男小C [模拟退火][贪心]

    宅男小C Time Limit: 10 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 众所周知,小C是个宅男,所以他的每 ...

  2. BZOJ2832 : 宅男小C

    首先将所有显然不在最优解中的外卖都删去,那么剩下的外卖价格越低,保质期也最短. 考虑三分订外卖的次数,然后贪心求解,每次尽量平均的时候可以做到最优化. 三分的时候,以存活天数为第一关键字,剩余钱数为第 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. poj 3009 (深搜求最短路)

    题目大意就是求在特定规则下的最短路,这个规则包含了消除障碍的操作.用BFS感觉选择消除障碍的时候不同路径会有影响,用DFS比较方便状态的还原(虽然效率比较低),因此这道题目采用DFS来写. 写的第一次 ...

  2. Windows平台下安装.net coreclr

    .net coreclr 已经发布RC1版本,安装方法如下: 1.安装DNVM,DNVM是.net运行时管理器,负责管理所有版本的.net运行时(.net framework..net coreclr ...

  3. 3dContactPointAnnotationTool开发日志(八)

      今天上午去实验室打算把项目从github上pull下来发现貌似不行,然后强行pull下来后项目变得乱七八糟了,有的组件都不知道去哪里了.去github上看了看发现上面day6和day7都没有,特别 ...

  4. 基于3D卷积神经网络的人体行为理解(论文笔记)(转)

    基于3D卷积神经网络的人体行为理解(论文笔记) zouxy09@qq.com http://blog.csdn.net/zouxy09 最近看Deep Learning的论文,看到这篇论文:3D Co ...

  5. thinkphp5 隐藏入口和支持pathinfo

    url里public目录的隐藏 其实正常思路的话这个url里的public本身就是不存在的,然后呢,其实也不叫隐藏public目录,这里只是考虑到有些童鞋可能还会按之前3.x时代的习惯来配置网站根目录 ...

  6. win7主题/默认账户图片路径

    账户图片位置 C:\ProgramData\Microsoft\User Account Pictures 主题位置 C:\Windows\Resources

  7. InnoDB,select为啥会阻塞insert?

    MySQL的InnoDB的细粒度行锁,是它最吸引人的特性之一. 但是,如<InnoDB,5项最佳实践>所述,如果查询没有命中索引,也将退化为表锁. InnoDB的细粒度锁,是实现在索引记录 ...

  8. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

  9. 【bzoj3142】[Hnoi2013]数列 数学

    题目描述 求满足 $1\le a_i\le n\ ,\ 1\le a_{i+1}-a_i\le m$ 的序列 $a_1...a_k$ 的个数模 $p$ 的值. 输入 只有一行用空格隔开的四个数:N.K ...

  10. 转:Conjugate prior-共轭先验的解释

    Conjugate prior-共轭先验的解释    原文:http://blog.csdn.net/polly_yang/article/details/8250161 一 问题来源: 看PRML第 ...