BZOJ1229 USACO2008 Nov toy 玩具 【三分+贪心】*
BZOJ1229 USACO2008 Nov toy 玩具
Description
玩具 [Chen Hu, 2006]
Bessie的生日快到了, 她希望用D (1 <= D <= 100,000; 70%的测试数据都满足 1 <= D <= 500)天来庆祝. 奶牛们的注意力不会太集中, 因此Bessie想通过提供玩具的方式来使它们高兴. 她已经计算出了第i天需要的玩具数T_i (1 <= T_i <= 50). Bessie的幼儿园提供了许多服务给它们的奶牛程序员们, 包括一个每天以Tc (1 <= Tc <= 60)美元卖出商品的玩具店. Bessie想尽可能的节省钱, 但是Farmer John担心没有经过消毒的玩具会带来传染病(玩具店卖出的玩具是经过消毒的). 有两种消毒的方式. 第1种方式需要收费C1美元, 需要N1个晚上的时间; 第2种方式需要收费 C2美元, 需要N2个晚上的时间(1 <= N1 <= D; 1 <= N2 <= D; 1 <= C1 <= 60; 1 <= C2 <= 60). Bessie在party结束之后把她的玩具带去消毒. 如果消毒只需要一天, 那么第二天就可以拿到; 如果还需要一天, 那么第三天才可以拿到. 作为一个受过教育的奶牛, Bessie已经了解到节约的意义. 帮助她找到提供玩具的最便宜的方法.
Input
- 第 1 行: 六个用空格隔开的整数 D, N1, N2, C1, C2, Tc
- 第 2..D+1 行: 第 i+1 行包含一个整数: T_i
Output
第 1 行: 提供玩具所需要的最小费用.
Sample Input
4 1 2 2 1 3
8
2
1
6
输入解释:
Bessie想开4天的party, 第1天需要8个玩具, 第2天需要2个玩具, 第3天需要1个玩具,
第4天需要6个玩具. 第一种方式需要2,用时1天;第二种方式需要" role="presentation">2,用时1天;第二种方式需要2,用时1天;第二种方式需要1, 用时2天. 买
一个玩具需要$3.
Sample Output
35
输出解释:
第 1 天 买8个玩具, 花去24; 送2个玩具去快洗, 6个慢洗.
第 2 天 取回2个快洗的玩具, 花去4. 送1个玩具去慢洗.
第 3 天 取回6个慢洗的玩具, 花去6.
第 4 天 取回所有的玩具(与现有的加在一起正好6个), 花去1. 这样就用了最少的钱.
我们可以考虑当购买的玩具确定的时候会发生什么
很显然除了一些玩具数太少的情况其他的情况都是可行的
然后我也不知道为什么花费是单峰的
网上好像也没什么大佬给出了证明
可以意会一下,当购买的玩具增加,购买的花费呈一次函数,然后消毒的花费应该是递减的,然后好像可以想当然的认为这是个单峰函数
然后就三分+check
在check的时候可以维护一下当前可以用第一种方案消毒的,可以第二种方案消毒的然后进行贪心,至于不合法的状态直接判过去就好了
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define INF 0x3f3f3f3f
#define pi pair<int,int>
int n,n1,n2,c1,c2,tc;
int d[N];
deque<pi> t,p,q;
int calc(int x){
t.clear();
p.clear();
q.clear();
int sum=(tc-c2)*x;
p.push_back(make_pair(0,x));
for(int i=1;i<=n;++i){
while(!t.empty()&&i-t.front().first>=n1)q.push_back(t.front()),t.pop_front();
while(!q.empty()&&i-q.front().first>=n2)p.push_back(q.front()),q.pop_front();
int now=d[i];
while(now){
if(!p.empty()){
if(p.back().second>now){
p.back().second-=now;
sum+=now*c2;now=0;
break;
}
now-=p.back().second;
sum+=p.back().second*c2;
p.pop_back();
continue;
}
if(!q.empty()){
if(q.back().second>now){
q.back().second-=now;
sum+=now*c1;now=0;
break;
}
now-=q.back().second;
sum+=q.back().second*c1;
q.pop_back();
continue;
}
return INF;
}
t.push_back(make_pair(i,d[i]));
}
return sum;
}
int main(){
freopen("1229.in","r",stdin);
scanf("%d%d%d%d%d%d",&n,&n1,&n2,&c1,&c2,&tc);
if(n1>n2)swap(c1,c2),swap(n1,n2);
int sum=0;
for(int i=1;i<=n;i++)scanf("%d",&d[i]),sum+=d[i];
int l=1,r=sum;
while(l+10<r){
int tmp=(r-l)/3;
int ll=l+tmp,rr=r-tmp;
if(calc(ll)<calc(rr))r=rr;
else l=ll;
}
int ans=INF;
for(int i=l;i<=r;i++)ans=min(ans,calc(i));
printf("%d",ans);
return 0;
}
BZOJ1229 USACO2008 Nov toy 玩具 【三分+贪心】*的更多相关文章
- BZOJ_1229_[USACO2008 Nov]toy 玩具_三分+贪心
BZOJ_1229_[USACO2008 Nov]toy 玩具_三分+贪心 Description 玩具 [Chen Hu, 2006] Bessie的生日快到了, 她希望用D (1 <= D ...
- Bzoj 1229: [USACO2008 Nov]toy 玩具 题解 三分+贪心
1229: [USACO2008 Nov]toy 玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 338 Solved: 136[Submit] ...
- BZOJ1229 & 洛谷2917:[USACO2008 NOV]toy 玩具 & 洛谷4480:[BJWC2018]餐巾计划问题——题解
标题很长emmm…… [USACO2008 NOV]toy 玩具 https://www.luogu.org/problemnew/show/P2917 https://www.lydsy.com/J ...
- BZOJ 1229: [USACO2008 Nov]toy 玩具
BZOJ 1229: [USACO2008 Nov]toy 玩具 标签(空格分隔): OI-BZOJ OI-三分 OI-双端队列 OI-贪心 Time Limit: 10 Sec Memory Lim ...
- 【BZOJ】1229 [USACO2008 Nov]toy 玩具
[算法]三分+贪心 [题解] 数据范围小的版本:餐巾计划 这题不是使用最小费用流的下凸函数,因为这题是要满足最大流,那么这题到底在三分什么? 三分的这个函数,其实是总费用随卖出玩具量变化而变化的函数, ...
- BZOJ 1229 [USACO2008 Nov]toy 玩具(三分+贪心)
[题木链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1229 [题目大意] 每天对玩具都有一定的需求ni,每天可以花f价值每条购买玩具, 当天 ...
- BZOJ 1230: [Usaco2008 Nov]lites 开关灯( 线段树 )
线段树.. --------------------------------------------------------------------------------- #include< ...
- 1230: [Usaco2008 Nov]lites 开关灯
1230: [Usaco2008 Nov]lites 开关灯 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1162 Solved: 589[Sub ...
- 1620: [Usaco2008 Nov]Time Management 时间管理
1620: [Usaco2008 Nov]Time Management 时间管理 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 506 Solved: ...
随机推荐
- select * from table_name where 1=1的
我们先来看看这个语句的结果:select * from table where 1=1,其中where 1=1,由于1=1永远是成立的,返回TRUE,条件为真:所以,这条语句,就相当于select * ...
- vue-router之学习笔记
用 Vue.js + vue-router 创建单页应用,是非常简单的.使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件( ...
- Spring Boot技术栈博客笔记(1)
要实现的核心功能 用户管理 安全设置 博客管理 评论管理 点赞管理 分类管理 标签管理 首页搜索 核心技术 数据存储 随着spring3发布以来,spring团队减少使用xml配置的使用,采用大量约定 ...
- 最新Dubbo-admin+Zookeeper搭建
Zookeeper搭建: 下载zookeeper压缩包并解压,下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/进入conf目录下将 zoo_sa ...
- spring mvc: 参数方法名称解析器(用参数来解析控制器下的方法)MultiActionController/ParameterMethodNameResolver/ControllerClassNameHandlerMapping
spring mvc: 参数方法名称解析器(用参数来解析控制器下的方法)MultiActionController/ParameterMethodNameResolver/ControllerClas ...
- UVALive-5135 Mining Your Own Business (无向图的双连通分量)
题目分析:在一张无向图中,将一些点涂上黑色,使得删掉图中任何一个点时,每个连通分量至少有一个黑点.问最少能涂几个黑点,并且在涂最少的情况下有几种方案. 题目分析:显然,一定不能涂割点.对于每一个连通分 ...
- 小练习:补数 (Number Complement)
1.eamples Input: Output: Explanation: The binary representation of (no leading zero bits), and its c ...
- 通过fork进程爆破canary
1.1.1 通过fork进程爆破canary ⑴.原理分析: 对fork而言,作用相当于自我复制,每一次复制出来的程序,内存布局都是一样的,当然canary值也一样.那我们就可以逐位爆破,如果程 ...
- python3 堆排序
思路: 1.建立堆 2.得到堆顶元素,为最大元素 3.去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序. 4.堆顶元素为第二大元素. 5.重复步骤3,直到堆变空. 动画 代码: de ...
- 【实用工具】google访问不了比较好的解决办法
一.直接添加ip,74.125.128.(31~167)都可以,不过不稳定 二.不使用.hk的后缀名,使用.tw,co.jp等均可(同IE用户) 三.下载这个脚本,进行安装(右上角点击“install ...