博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 3874: [Ahoi2014]宅男计划
阅读量:4317 次
发布时间:2019-06-06

本文共 1644 字,大约阅读时间需要 5 分钟。

AunWFI.png

AunfYt.png

\(solution:\)

看到这一题题面,莫名想到了(蔬菜),于是莫名开始恐慌。考场上只知道有个贪心计算快递小哥来一次,我要买能活n天的最小花费,却没想到还有一个三分法来枚举快递小哥来的次数!

首先我们可以脑补一下,快递小哥来的次数,和宅男活的总天数是成一个二次函数关系的。就像快递小哥来的次数少,那宅男多数的钱只能分到这么少的购买次数中,因为便宜的保质期短,每次必然会买一些保质期长价格贵的食物;当快递小哥来的次数多了,那我的钱可以分配到很多次购买机会中,是可以每次买些便宜的,可是你就会发现钱不多了(都给快递小哥付运费了!)所以我们三分找到中间的那一个平衡点(合理的购买次数能(钱尽其用)活得更久!!)

这是三分,那本题贪心贪在哪儿呢?我们读题发现,他给你的食品中肯定有一些垃圾食品(价格贵,保质期又短),我们可以进行筛选:单调队列,先将食品按保质期从大到小排序,然后放入以价格单调增的队列中去(因为后面放进取得食品保质期一定更长(排了序的),一但价格还比前一个低,就可以取代前一个食品)

然后还有一个贪心,就是在\(check()\)函数中,计算能活的最长天数时,只要在保质期内,我一定买最便宜的。就像我现在经筛选后有两个食品,一个保质期为5,价格为4,另一个保质期为8,价格为7,那我\([1,6]\)天一定买第一个,\([7,9]\)天一定买第二个!因为我们单调栈中时间从小到大,所以每次算活得最长天数时复杂度$O(n)

$再加上三分的复杂度,本题刚好够用!

然后对代吗做个解释:因为根据题意,保质期为1天的食品,可以留两天!!!(被这个坑惨了)所以我们在读入时干脆就给保质期加一,这样方便运算!然后解释一下我的\(check()\)函数:

  1. 我的\(check()\)买东西时,是同步的,如果买一个食品,那快递小哥来的\(x\)次都买这个食品(那个\(if\)除外)
  2. \(left:\)我还剩下的钱的数量,(因为特性1,所以每一次都要减去我买的食品的价格乘以它的数量再乘以\(x\)天)
  3. \(now:\)我同步买东西能同步维持的天数目前是多少
  4. \(day:\)我有几天需要买这一种食品(如果没有足够的钱贪心的买,就会转到\(if\)中去)
  5. \(tot:\)我总共能维持多少天
  6. \(if(now<b[i].t):\)我没足够的钱来\(x\)天同步买一个东西,那我能买几天买几天,然后$return $

接下来一切以代码为准:

\(code:\)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define db double#define inf 0x7fffffff#define rg register intusing namespace std;struct su{ ll v,t;}a[215],b[215];ll n,top;ll ans,m,f;//如题inline ll qr(){//快读,可以忽略 char ch; while((ch=getchar())<'0'||ch>'9'); ll res=ch^48; while((ch=getchar())>='0'&&ch<='9') res=res*10+(ch^48); return res;}inline bool cmp(su x,su y){return x.t

转载于:https://www.cnblogs.com/812-xiao-wen/p/10332544.html

你可能感兴趣的文章
【洛谷P3384】树链剖分
查看>>
Json解析两种方法以及U3d配置安卓环境
查看>>
MFC之自绘控件
查看>>
JDK源码阅读之PipedInoutStream与PipedOutputStream
查看>>
LibSVM源码剖析(java版)
查看>>
2018-2019-1 20165236 实验五 通讯协议设计
查看>>
快递---快递鸟的电子面单取消操作-----------
查看>>
shop++二次开发分享(新增编号类型)
查看>>
<select> 标签使用
查看>>
那些年我们装过的数据库---盘点sqlserver2008安装时遇到的各种的问题(持续更新中)...
查看>>
oo第一次博客总结
查看>>
android 入门-本地化语言
查看>>
【BZOJ】【3757】苹果树
查看>>
莫比乌斯函数&莫比乌斯反演
查看>>
8 并发编程-(线程)-多线程与多进程的区别&Thread对象的其他属性或方法
查看>>
看到第三条眼眶已经湿了
查看>>
记一次CentOS7进单用户模式修改密码的失败经历(faild to load SELinux policy freezing)...
查看>>
shh整合后web.xml、spring配置文件和struts.xml的内容
查看>>
ExportToExcel SharePointSolutionInstaller
查看>>
C# 发送邮件内容嵌入图片
查看>>