Bzoj2832 / Bzoj3874 宅男小C
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
Output
Sample Input
5 0
10 2
10 10 1
10 10
10 1 1
1 5
Sample Output
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的更多相关文章
- 【BZOJ2832&&3874】宅男小C [模拟退火][贪心]
宅男小C Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 众所周知,小C是个宅男,所以他的每 ...
- BZOJ2832 : 宅男小C
首先将所有显然不在最优解中的外卖都删去,那么剩下的外卖价格越低,保质期也最短. 考虑三分订外卖的次数,然后贪心求解,每次尽量平均的时候可以做到最优化. 三分的时候,以存活天数为第一关键字,剩余钱数为第 ...
- 【BZOJ3874】[AHOI&JSOI2014]宅男计划(贪心,三分)
[BZOJ3874][AHOI&JSOI2014]宅男计划(贪心,三分) 题面 BZOJ 洛谷 题解 大力猜想一最长的天数和购买外卖的总次数是单峰的.感性理解一下就是买\(0\)次是\(0\) ...
- BZOJ3874:[AHOI2014&JSOI2014]宅男计划(爬山法)
Description [故事背景] 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY 不得不依靠叫外卖来维持生计. [问题描述] 外卖店一共有N种食物,分别有1到N编号.第i种 ...
- bzoj3874&2832 [Ahoi2014]宅男计划 模拟退火,三分
[Ahoi2014&Jsoi2014]宅男计划 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 962 Solved: 371[Submit][ ...
- bzoj 3874: [Ahoi2014]宅男计划
Description [故事背景] 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY 不得不依靠叫外卖来维持生计. [问题描述] 外卖店一共有N种食物,分别有1到N编号.第i种 ...
- 外卖(food) & 洛谷4040宅男计划 三分套二分&贪心
food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久. 外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 Si ...
- [luogu] P4040 [AHOI2014/JSOI2014]宅男计划(贪心)
P4040 [AHOI2014/JSOI2014]宅男计划 题目背景 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY不得不依靠叫外卖来维持生计. 题目描述 外卖店一共有N种食物, ...
- Bzoj 3874: [Ahoi2014&Jsoi2014]宅男计划 三分+贪心
3874: [Ahoi2014&Jsoi2014]宅男计划 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 861 Solved: 336[Su ...
随机推荐
- c# load xml 中文报错
<?xml version="1.0" encoding="GB2312"?>
- Khan Academy
Khan Academy是一个免费的学院. 致力于教育改革. 百度百科:ohn Resig 百度百科有记者采访,采访内容比较有意思.
- Java中ArrayList与数组间相互转换
在实际的 Java 开发中,如何选择数据结构是一个非常重要的问题. 衡量标准化(读的效率与改的效率) : ① Array: 读快改慢 ② Linked :改快读慢 ③ Hash:介于两者之间 实现Li ...
- iOS- 网络访问JSON数据类型与XML数据类型的实现思路及它们之间的区别
1.JSON (基本上移动开发的主要数据传输都是JSON) 1.1.JSON特点: a.[] 表示数组 b.{} 表示字典 - 对象模型建立关系 c.应用非常多,基本上移动开发的主要数据传输都是JSO ...
- TCP系列18—重传—8、FACK及SACK reneging下的重传
一.介绍 FACK的全称是forward acknowledgement,FACK通过记录SACK块中系列号最大(forward-most)的SACK块来推测丢包信息,在linux中使用fackets ...
- C#控件DropDownList下拉列表默认打开
c#中的控件DropDownList要实现默打开确实不容易,之前也是想过页面上的点击之后就打开了,那直接模拟点击不就行了,试过后大失所望,根本没有效果. 于是网上找到了一个例子能实现IE浏览器下的打开 ...
- DEDE去掉会员登录及注册验证码的方法
1.登录打开member/index_do.php 删除245-250行,即: if(strtolower($vdcode)!=$svali || $svali=='') { ResetVdValue ...
- [CLR via C#]基元类型
一.什么是基元类型 某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们.例如,可以使用以下语法来分配一个整数: System.Int32 a = new System.Int32() ...
- 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报错,用到注解的 ...
- prototype的本质
在<关于思维方式的思绪>那篇文章里提到了, 原型的本质就是一种委托关系. 即我这里没有,就到我的原型里去看看,一旦找到就当成我的用. 本文详细说一下这个事情. 比如某女买东西,钱都是她老公 ...