「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 ...
随机推荐
- C语言程序设计100例之(27):回旋方阵
例27 回旋方阵 问题描述 编写程序,生成从内到外是连续的自然数排列的回旋方阵.例如,当n=3和n=4时的回旋方阵如下图1所示. 图1 由内到外回旋方阵 输入格式 一个正整数n(1≤n ...
- 命名元组nametuple
# coding:utf-8 from collections import namedtuple Student = namedtuple('Student', ['no', 'name', 'ag ...
- VIM - ex 命令行的窗口切换
1. 概述 操作 vim 同时编辑多个文件 约定 ctrl 使用按键 ctrl + w 时, 写作 ^W 思路 我记得这个由两个机制 ex 命令与缓冲区 分屏 2. 场景 文件 file1 file2 ...
- 题解 P1283 【平板涂色】
P1283 平板涂色 数据范围也太小了qwq..适合本萌新暴搜 小小的剪枝: 1.用pre预处理出每块矩形上方的矩形,pre[i][0]记录数目(如果数据范围再开大一点,直接1~n枚举判断可能超时qw ...
- word中如何删除一张空白表格
百度知道:https://baijiahao.baidu.com/s?id=1631677477148377412&wfr=spider&for=pc 当word中出现如下一张空白表格 ...
- java 反射获取设置私有成员变量的值
for (Object arg:args) { //处理applicationCode Class<?> argClass = arg.getClass(); Field applicat ...
- C:产生随机数
函数说明 #include <time.h> time_t time(time_t *t); 功能:获取当前系统时间 参数:常设置为NULL 返回值:当前系统时间, time_t 相当于l ...
- python日常题目小练习
1.使用while循环输出1 2 3 4 5 6 8 9 10 i=0 while i<10: i+=1 if i==7: continue print(i) 结果: 2.求1-100的所有数的 ...
- java 生成/解读 二维码
package com.rails.util; import com.swetake.util.Qrcode; import jp.sourceforge.qrcode.QRCodeDecoder; ...
- Hack the box邀请码和注册问题总结
注意下,有3个坑, 1. 解码方式是随机的,记得看DATA下面提示用哪种 2. post时候可以直接用f12里的console,命令是: $.post('https://www.hackthebox. ...