「AHOI2014/JSOI2014」宅男计划
「AHOI2014/JSOI2014」宅男计划
我们首先要发现一个性质:存货天数随买食物的次数的变化类似于单峰函数。
具体证明不会啊,好像是二分加三分来证明?但是没有找到明确的严格证明。
感性理解一下就是:买的食物太少,很容易饿死;买太多就没钱了,也活不长。
所以我们考虑如何对于当前三分的答案如何 \(\text{check}\) 。
有一个显而易见的性质就是我们不会用价格更高,质量更劣的食品。
也就是说我们希望价格高的食品质量也一定要更好。
所以我们可以把所有食物按照价格或者质量排序,然后开个单调栈扫一遍即可。
然后贪心策略就是说我们肯定是在一段时间内坚持吃一种食物直到过期或者没钱,这个就很好算了。
参考代码:
#include <algorithm>
#include <cstdio>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
}
typedef long long LL;
const int _ = 202;
LL M, F; int n, top, stk[_]; struct node { LL p, s; } t[_];
inline bool cmp(const node& x, const node& y) { return x.p > y.p; }
inline LL calc(LL x) {
LL m = M - x * F, res = 0, sum = 0;
for (rg int i = n; i >= 1; --i) {
LL tmp = min(m / (t[i].p * x), t[i].s - sum);
sum += tmp, res += tmp * x, m -= tmp * x * t[i].p;
if (sum < t[i].s) { res += m / t[i].p; break; }
}
return res;
}
int main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(M), read(F), read(n);
for (rg int i = 1; i <= n; ++i) read(t[i].p), read(t[i].s), ++t[i].s;
sort(t + 1, t + n + 1, cmp);
top = 0;
for (rg int i = 1; i <= n; ++i) { while (top && t[i].s >= t[stk[top]].s) --top; stk[++top] = i; }
n = top; for (rg int i = 1; i <= n; ++i) t[i] = t[stk[i]];
LL l = 1, r = M / F;
while (l < r) {
LL lmid = (2 * l + r) / 3;
LL rmid = (2 * r + l + 2) / 3;
if (calc(lmid) < calc(rmid)) l = lmid + 1; else r = rmid - 1;
}
printf("%lld\n", calc(l));
return 0;
}
「AHOI2014/JSOI2014」宅男计划的更多相关文章
- 「AHOI2014/JSOI2014」拼图
「AHOI2014/JSOI2014」拼图 传送门 看到 \(n \times m \le 10^5\) ,考虑根号分治. 对于 \(n < m\) 的情况,我们可以枚举最终矩形的上下边界 \( ...
- 「AHOI2014/JSOI2014」奇怪的计算器
「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...
- 「AHOI2014/JSOI2014」骑士游戏
「AHOI2014/JSOI2014」骑士游戏 传送门 考虑 \(\text{DP}\). 设 \(dp_i\) 表示灭种(雾)一只编号为 \(i\) 的怪物的代价. 那么转移显然是: \[dp_i ...
- 「AHOI2014/JSOI2014」支线剧情
「AHOI2014/JSOI2014」支线剧情 传送门 上下界网络流. 以 \(1\) 号节点为源点 \(s\) ,新建一个汇点 \(t\),如果 \(u\) 能到 \(v\),那么连边 \(u \t ...
- [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 ...
- bzoj3874&2832 [Ahoi2014]宅男计划 模拟退火,三分
[Ahoi2014&Jsoi2014]宅男计划 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 962 Solved: 371[Submit][ ...
- 【BZOJ3874】[AHOI&JSOI2014]宅男计划(贪心,三分)
[BZOJ3874][AHOI&JSOI2014]宅男计划(贪心,三分) 题面 BZOJ 洛谷 题解 大力猜想一最长的天数和购买外卖的总次数是单峰的.感性理解一下就是买\(0\)次是\(0\) ...
- 外卖(food) & 洛谷4040宅男计划 三分套二分&贪心
food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久. 外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 Si ...
随机推荐
- vue+vuex项目中怎么实现input模糊查询
1,首先给input框添加方法,但是用的是element-ui的组件,对input进行了封装,不能直接用原生的方法!,在element组件中,input框中方法有实例参数$event,代表事件对象 ...
- Day1 面向对象编程与Java核心类
this变量 在方法内部,可以使用一个隐含的变量this,它始终指向当前实例.如果没有命名冲突,可以省略this. 但是,如果有局部变量和字段重名,那么局部变量优先级更高,就必须加上this. 构造方 ...
- MVC简要介绍
(转自:http://www.cnbeta.com/articles/107924.htm) MVC不是一种设计模式(design pattern),它是一种架构模式(Architectural pa ...
- webRTC中回声消除(AEC)模块编译时aec_rdft.c文件报错:
webRTC中回声消除(AEC)模块编译时aec_rdft.c文件报错. 原因是: 局部变量ip跟全局变量冲突的问题,可以将局部变量重新命名一下,就可以通过编译了. aec_rdft.c修改以后文件代 ...
- CF1208G Polygons 数论
题目链接:https://codeforces.com/contest/1208/problem/G 题意:给定两个正整数\(n\)和\(k\),询问在一个圆上你最少需要几个点,才能在这些点上构造出\ ...
- 深度学习之反向传播算法(BP)代码实现
反向传播算法实战 本文仅仅是反向传播算法的实现,不涉及公式推导,如果对反向传播算法公式推导不熟悉,强烈建议查看另一篇文章神经网络之反向传播算法(BP)公式推导(超详细) 我们将实现一个 4 层的全连接 ...
- STM32F030 启用内部晶振并配置系统时钟为48M
在文件 system_stm32f0xx.c 里的函数 static void SetSysClock(void) { if (HSEStatus == (uint32_t)0x01) // 存在外部 ...
- Java面向对象封装优化1_this(Python中的self)
1. 类 package cn.itcast.day06.demo03; /* 问题描述:定义Person的年龄时,无法阻止不合理的数值被设置进来. 解决方案:用private关键字将需要保护的成员变 ...
- mac机器smb映射
1 finder中打开前往 2 输入:smb://10.216.90.* 链接 3 输入 账户和密码(名称和密码是你机器的smb密码:比如123***)
- JS知识点查漏补缺
知识点1: 判断语句中遇到NaN即为 False 只需要注意遇到False即为False即可 使用join(),toString()皆可以将数组转化为字符串 二者的相同点在于都可以转化数组为字符串 二 ...