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. c# load xml 中文报错

    <?xml version="1.0" encoding="GB2312"?>

  2. Khan Academy

    Khan Academy是一个免费的学院. 致力于教育改革. 百度百科:ohn Resig 百度百科有记者采访,采访内容比较有意思.

  3. Java中ArrayList与数组间相互转换

    在实际的 Java 开发中,如何选择数据结构是一个非常重要的问题. 衡量标准化(读的效率与改的效率) : ① Array: 读快改慢 ② Linked :改快读慢 ③ Hash:介于两者之间 实现Li ...

  4. iOS- 网络访问JSON数据类型与XML数据类型的实现思路及它们之间的区别

    1.JSON (基本上移动开发的主要数据传输都是JSON) 1.1.JSON特点: a.[] 表示数组 b.{} 表示字典 - 对象模型建立关系 c.应用非常多,基本上移动开发的主要数据传输都是JSO ...

  5. TCP系列18—重传—8、FACK及SACK reneging下的重传

    一.介绍 FACK的全称是forward acknowledgement,FACK通过记录SACK块中系列号最大(forward-most)的SACK块来推测丢包信息,在linux中使用fackets ...

  6. C#控件DropDownList下拉列表默认打开

    c#中的控件DropDownList要实现默打开确实不容易,之前也是想过页面上的点击之后就打开了,那直接模拟点击不就行了,试过后大失所望,根本没有效果. 于是网上找到了一个例子能实现IE浏览器下的打开 ...

  7. DEDE去掉会员登录及注册验证码的方法

    1.登录打开member/index_do.php 删除245-250行,即: if(strtolower($vdcode)!=$svali || $svali=='') { ResetVdValue ...

  8. [CLR via C#]基元类型

    一.什么是基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们.例如,可以使用以下语法来分配一个整数: System.Int32 a = new System.Int32() ...

  9. AndroidStudio3.0 注解报错Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor.

    把Androidstudio2.2的项目放到3.0里面去了,然后开始报错了. 体验最新版AndroidStudio3.0 Canary 8的时候,发现之前项目的butter knife报错,用到注解的 ...

  10. prototype的本质

    在<关于思维方式的思绪>那篇文章里提到了, 原型的本质就是一种委托关系. 即我这里没有,就到我的原型里去看看,一旦找到就当成我的用. 本文详细说一下这个事情. 比如某女买东西,钱都是她老公 ...