题目

http://cogs.pro/cogs/problem/problem.php?pid=2007

分析

首先,稍有常识的人都会看出,这道题其实就是网络流24题中“餐巾问题”的加强版。
“餐巾问题”的标准做法是费用流:每天拆成两点(i,i'),然后S向i'连容量Ti(第i天用量),费用0的边,代表当天的脏餐巾。当然还有别的边,但这个是最重要的。
其实“餐巾问题”还有一个枚举+贪心的做法。
假设我们已经确定了一共新买多少餐巾。那我们一开始就把这些餐巾全买下来,然后从第1天到第N天逐天进行模拟:
①如果还有一些新买的餐巾,就用掉它们。
②如果不够,从后往前枚举第i-slow~1天,慢洗这些天的脏餐巾。(慢洗需要slow天)
③如果还不够,从后往前枚举第i-fast~i-slow+1天,快洗这些天的脏餐巾。(快洗需要fast天)
这个做法的正确性比较显然。就是尽量慢洗,不行再尽量快洗,并且尽量使用靠后日期产生的脏餐巾。
对“餐巾问题”而言,我们只需要暴力枚举总共买多少餐巾即可。
但对于这里N<=10^5的情况而言,暴力枚举并不行。
怎么办呢?
答案是:假如把新买x个的花费视作一个函数f(x),那么它是单峰的(严格来讲是下凸)。
为什么呢?回到我们的网络流模型。一开始我们会把代表脏餐巾的边流满(费用为0),然后每流一次,就代表多买一些餐巾。而每次找出的最短路长度是在不断上升的,换言之,f(x)的一阶导数在不断上升(这个‘一阶导数’可以粗略地认为是每次找出的最短路长度)。于是f(x)就是下凸的了。
所以三分x就可以解决N<=10^5的这道题了。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>
using namespace std;
typedef long long LL;
const int SIZEN=100010;
const int INF=0x7fffffff/2;
int N;
int price;
int slow_cost,slow_wait,fast_cost,fast_wait;
int need[SIZEN]={0};
deque<pair<int,int> > can_slow,can_fast,late;//first是日期,second是个数
int calc(int buy){//购买buy个int ans=buy*price;can_fast.clear();can_slow.clear();late.clear();for(int i=1;i<=N;i++){while(!late.empty()&&late.front().first<=i-fast_wait){can_fast.push_back(late.front());late.pop_front();}while(!can_fast.empty()&&can_fast.front().first<=i-slow_wait){can_slow.push_back(can_fast.front());can_fast.pop_front();}int now=need[i];int t=min(now,buy);now-=t,buy-=t;while(now&&!can_slow.empty()){t=min(now,can_slow.back().second);ans+=t*slow_cost;now-=t,can_slow.back().second-=t;if(!can_slow.back().second) can_slow.pop_back();}while(now&&!can_fast.empty()){t=min(now,can_fast.back().second);ans+=t*fast_cost;now-=t,can_fast.back().second-=t;if(!can_fast.back().second) can_fast.pop_back();}if(now) return INF;late.push_back(make_pair(i,need[i]));}return ans;
}
void work(void){int l=0,r=0;for(int i=1;i<=N;i++) r+=need[i];while(r-l>2){int m1=(2*l+r)/3,m2=(l+2*r+2)/3;int f1=calc(m1),f2=calc(m2);if(f1>=f2) l=m1;else r=m2;}int ans=INF;for(int i=l;i<=r;i++) ans=min(ans,calc(i));printf("%d\n",ans);
}
void read(void){scanf("%d",&N);scanf("%d%d",&fast_wait,&slow_wait);scanf("%d%d",&fast_cost,&slow_cost);if(fast_wait>slow_wait){swap(fast_wait,slow_wait);swap(fast_cost,slow_cost);}if(slow_cost>fast_cost){slow_wait=fast_wait;slow_cost=fast_cost;}scanf("%d",&price);for(int i=1;i<=N;i++) scanf("%d",&need[i]);
}
int main(){freopen("toy.in","r",stdin);freopen("toy.out","w",stdout);read();work();return 0;
}

[USACO Nov08]玩具toys解题报告相关推荐

  1. USACO 1.3... 虫洞 解题报告(搜索+强大剪枝+模拟)

    这题可真是又让我找到了八数码的感觉...哈哈.首先,第一次见题,没有思路,第二次看题,感觉是搜索,就这样写下来了.这题我几乎是一个点一个点改对的(至于为什么是这样,后面给你看一个神奇的东西),让我发现 ...

  2. USACO Betsy's Tour 解题报告

    大神做了这道题:https://www.byvoid.com/blog/usaco-544-betsys-tour.解释得非常清楚,我也是按照这种方法做的,即统计"必经点"的个数, ...

  3. USACO 3.3.2 Shopping Offers解题报告

    写在前面:因为之前没写的C++的USACO Training的解题报告太多--所以就不写了,要是想要代码可以联系我:xiedong_1993@foxmail.com 这题就是传说中的五维背包,其实写起 ...

  4. USACO Section2.1 Hamming Codes 解题报告 【icedream61】

    hamming解题报告 ---------------------------------------------------------------------------------------- ...

  5. USACO Section2.2 Preface Numbering 解题报告 【icedream61】

    preface解题报告 ---------------------------------------------------------------------------------------- ...

  6. USACO Section1.3 Combination Lock 解题报告

    combo解题报告 -- icedream61 博客园(转载请注明出处) --------------------------------------------------------------- ...

  7. USACO Section1.5 Superprime Rib 解题报告

    sprime解题报告 -- icedream61 博客园(转载请注明出处) -------------------------------------------------------------- ...

  8. USACO Training Section 1.3 Calf Flac 解题报告AC代码

    解题报告: 主要方法是生长法,考虑每一位的左右各有多长的回文串,输出最长的那个,比较好想--不过要注意区分字串的奇偶. 其他实现细节看代码里的注释吧-- AC代码: /* ID: yuanmz91 P ...

  9. 解题报告(五)组合计数(ACM / OI)超高质量题解

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. 2021年大数据Kafka(九):kafka消息存储及查询机制原理
  2. 神经科学家为视力受损的人研发新技术
  3. 页面加载后如何使JavaScript执行?
  4. golang设计模式之原型模式
  5. python 文件 IO 操作
  6. 【机器学习基础】XGBoost、LightGBM与CatBoost算法对比与调参
  7. 1048:有一门课不及格的学生
  8. matlab设计声音听听
  9. 【转】ELK 日志分析系统
  10. 知名网络安全专家访谈记
  11. python安装软件win10_在win10上安装Python和Tensorflow
  12. Java学习之==注释、数据类型、变量、运算符
  13. docker-简单操作
  14. [转载]----Hadoop2.0命令手册
  15. NOIP2013华容道
  16. 计算机学报范文,计算机学报论文
  17. PDF英文文档免费翻译成中文
  18. 2个月公众号粉丝破万的心路历程
  19. 宏观调控绝不是微观控制
  20. 室内声场计算机模拟的声线跟踪法和虚声源法,建筑物理课件.ppt

热门文章

  1. 某某网站 JS 逆向及 tls 指纹绕过分析
  2. 919 完全二叉树插入器
  3. CAPM1:有效市场假说
  4. word文档导航栏中的同级菜单不对齐
  5. OpenCV—python 发票印章去除或分割(图像内容识别预处理)
  6. 图像处理领域的大牛(转载收藏)
  7. 最大公共子串LCS(Java实现)
  8. [ZT]那些为游戏开创历史的英雄
  9. Android 自动化触发GC
  10. 用excel画像素画,和十字绣一样简单