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 ...
随机推荐
- Ubuntu 配置 ftp freemind adb
. 1. 配置apt-get源 配置过程 : sudo vim /etc/profile 命令, 在后面添加下面的内容; 刷新配置文件 : source /etc/profie 命令; 刷新源 : s ...
- Spring Boot(六)自定义事件及监听
事件及监听并不是SpringBoot的新功能,Spring框架早已提供了完善的事件监听机制,在Spring框架中实现事件监听的流程如下: 自定义事件,继承org.springframework.con ...
- c++设计模式----装饰模式
前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会使用:现在该怎么办呢? 将这 ...
- 3ds Max学习日记(七)
第7章讲的是多边形建模,实例略多,有十六个,再加上周日的怠惰感,只做了几个实例. 附上今日的劳动成果: 布料(创建一个平面,转换为可编辑多边形,然后调整顶点,连接一些边,添加网格平滑,转换为可 ...
- 201621044079 韩烨 week11-作业11-多线程
作业11-多线程 参考资料 多线程参考文件 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序 ...
- Node js路由
/* 要为程序提供请求的 URL 和其他需要的 GET 及 POST 参数,随后程序需要根据这些数据来执行相应的代码. 因此,需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST ...
- foreach循环2
<select id="test" parameterType="java.util.List" resultType="user"& ...
- (sender as TButton).some 和 TButton(sender).some 的区别是什么?
(sender as TButton).some 和 TButton(sender).some 的区别是什么? (Sender as TButton) 与 TButton(Sender) 都是 Typ ...
- Windows相关
PE WIndows 相关知识 windows 主机防护
- STL之一:字符串用法详解
转载于:http://blog.csdn.net/longshengguoji/article/details/8539471 字符串是程序设计中最复杂的变成内容之一.STL string类提供了强大 ...