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 ...
随机推荐
- 《学习OpenCV》课后习题解答2
题目:(P104) 创建一个拥有三个通道的二维字节类型矩阵,大小为100*100,并将所有值赋为0.通过函数cvPtr2D将指针指向中间的通道("绿色").以(20,5)与(40, ...
- Linux less命令语法
一.Linux less命令语法 less [参数] 文件 less命令非常强大,在此只介绍几个常用的参数,更多参数使用man less来查看Linux帮助手册. -b <缓冲区大小> 设 ...
- [CLR via C#]异常和状态管理
当CLR检测到某个正在运行的.NET应用程序处于一种特殊的正常执行顺序被打断的状态时,会生成一个异常对象来表示这个错误,并将此对象在方法调用堆栈中向上传送.如果一个程序引发了一个异常却没有处理,CLR ...
- KMP算法字符串查找子串
题目: 经典的KMP算法 分析: 和KMP算法对应的是BF算法,其中BF算法时间复杂度,最坏情况下可以达到O(n*m),而KMP算法的时间复杂度是O(n + m),所以,KMP算法效率高很多. 但是K ...
- 第69天:jQuery入口函数
一.jQuery入口函数 1.$(document).ready(function(){}); 2.$(function(){}); 二.事件处理程序 1.事件源 Js方式:document.get ...
- 【SQLAlchemy】SQLAlchemy技术文档(中文版)(上)
1.版本检查 import sqlalchemy sqlalchemy.__version__ 2.连接 from sqlalchemy import create_engine engine = c ...
- 【bzoj5094】硬盘检测 乱搞
题目描述 已知从 $n$ 个不同的32位无符号整数中随机选 $m=10000$ 次所得的结果,求可能性最大的 $n$ ,其中 $n=10^k,1\le k\le 7$. 输入 第一行包含一个正整数m( ...
- 【bzoj4602】[Sdoi2016]齿轮 BFS
题目描述 给出一张n个点m条边的有向图,每条边 (u,v,x,y) 描述了 u 的点权乘 x 等于 v 的点权乘 y (点权可以为负).问:是否存在满足条件的图. 输入 有多组数据,第一行给定整数T, ...
- Android开发中如何解析Json
解析Json 有了请求,自然会有响应,那我们该如何解析服务端响应返回给我们的Json数据呢? 了解什么是Json JSON(JavaScript object notation)是一种轻量级的数据交换 ...
- Flask的第一个应用
Flask 是一个 Python 实现的 Web 开发微框架,微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展. 与Django功能上比较: Django:中间件,路由系统,视图(CBV ...