「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;
}

最新文章

  1. 【开源】.net 分布式架构之监控平台
  2. GDAL 遥感图像处理后的数据保存为图像文件的实现方法
  3. Groovy split竖杆注意
  4. javascript 的button onclick事件不起作用的解决方法
  5. 利用 libiconv 实现汉字编码 utf-8 格式 和 gbk格式的相互转换
  6. 6.理解DispatcherServlet
  7. powershell命令大全
  8. 【转】基于RMAN实现坏块介质恢复(blockrecover)
  9. Android——监听开机启动,自启动应用程序
  10. getgrent
  11. EF连接MySQL数据Web.Config配置
  12. MySQL索引方法
  13. 201521123039 《java程序设计》第九周学习总结
  14. 异常-----freemarker.core.ParseException: Encountered &quot;string&quot;
  15. Java学习NO.3
  16. privacy policy url
  17. 自学Zabbix7.1 IT services
  18. uwsgi多进程配合kafka-python消息无法发送
  19. 利用js键盘事件制作会移动效果
  20. Android - 采用 SharedPreferences 存储数据

热门文章

  1. redis常用配置参数
  2. 第二十五篇 玩转数据结构——链表(Linked List)
  3. casperJs的安装2
  4. SpringMVC--使用hibernate validator数据校验
  5. React的React.createRef()/forwardRef()源码解析(三)
  6. Codeforces Round #621 (Div. 1 + Div. 2) D
  7. Docker - 命令 - docker image
  8. IDE - IDEA - 代码缩进设置
  9. Laravel 解决在ajax 请求下不能保存session的问题
  10. opencv:Mat对象