正题

题目链接:https://www.luogu.com.cn/problem/P4480


题目大意

\(n\)天,第\(i\)天需要\(a_i\)个餐巾。

每个餐巾价格为\(p\),使用完后有两种清洗方法

  1. 清洗\(m_1\)天,费用为\(c_1\)
  2. 清洗\(m_2\)天,费用为\(c_2\)

求满足所有需求的最小花费

\(1\leq n\leq 2\times 10^5,1\leq m_1,m_2\leq n,1\leq c_1,c_2,a_i\leq 100\)


解题思路

如果固定了购买的毛巾数量那么此题就有一个贪心的做法。

首先先把购买的全部优先使用了

然后如果快的那个洗法费用更低,那么显然全部用快的洗法。

否则就是一个快但是贵,一个慢但是便宜。那么我们的决策就是能用慢的就不使用快的。这个可以用决策后延来解决,当我们需要毛巾的时候再决定前面的毛巾的洗法。

这样的贪心是\(O(n)\)的,但是我们不能暴力枚举毛巾数量。

感性理解的话不难费用根据毛巾的数量呈一个单谷状,所以我们可以直接三分出这个谷底即可。

时间复杂度\(O(n\log (100n))\),因为\(deque\)比较慢所以我的标要开\(\text{-O2}\)才能过/kk


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=2e5+10,inf=2e9;
int n,p,m1,m2,c1,c2,w[N];
struct node{
int t,w;
node(int tt=0,int ww=0)
{t=tt;w=ww;return;}
};
deque<node> q1,q2,q3;
int calc(int x){
int ans=x*p;
q1.clear();q2.clear();q3.clear();
for(int i=1;i<=n;i++){
while(!q1.empty()&&q1.front().t+m1<=i)
q2.push_back(q1.front()),q1.pop_front();
while(!q2.empty()&&q2.front().t+m2<=i)
q3.push_back(q2.front()),q2.pop_front();
int v=w[i],tmp=min(v,x);x-=tmp;v-=tmp;
while(v&&!q3.empty()){
tmp=min(v,q3.back().w);
v-=tmp;ans+=tmp*c2;
if(tmp==q3.back().w)q3.pop_back();
else q3.back().w-=tmp;
}
while(v&&!q2.empty()){
tmp=min(v,q2.back().w);
v-=tmp;ans+=tmp*c1;
if(tmp==q2.back().w)q2.pop_back();
else q2.back().w-=tmp;
}
if(v)return inf;
q1.push_back(node(i,w[i]));
}
return ans;
}
int main()
{
scanf("%d%d%d%d%d%d",&n,&m1,&m2,&c1,&c2,&p);
if(m1>m2)swap(m1,m2),swap(c1,c2);
if(c1<c2)c2=c1,m2=m1;
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
int l=1,r=n*100;
while(l<=r){
int mid=(l+r)>>1;
if(calc(mid)<calc(mid+1))r=mid-1;
else l=mid+1;
}
printf("%d\n",calc(l));
return 0;
}

P4480-[BJWC2018]餐巾计划问题【三分,贪心】的更多相关文章

  1. BZOJ1229 & 洛谷2917:[USACO2008 NOV]toy 玩具 & 洛谷4480:[BJWC2018]餐巾计划问题——题解

    标题很长emmm…… [USACO2008 NOV]toy 玩具 https://www.luogu.org/problemnew/show/P2917 https://www.lydsy.com/J ...

  2. P4480 「BJWC2018」「网络流与线性规划24题」餐巾计划问题

    刷了n次用了奇淫技巧才拿到rk1,亥 这道题是网络流二十四题中「餐巾计划问题」的加强版. 于是怀着试一试的心情用费用流交了一发: 哇塞,过了9个点!(强烈谴责出题人用*造数据 下面是费用流解法简述: ...

  3. bzoj5164: 餐厅计划问题(三分+贪心)

    网络流经典题里餐巾计划的加强版...天数变成了$10^5$,那就不能用费用流做了... 考虑费用流的时候,单位费用随流量的增加而减少,也就是说费用其实是个单峰(下凸)函数. 那么可以三分要买的餐巾个数 ...

  4. 初识费用流 模板(spfa+slf优化) 餐巾计划问题

    今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...

  5. P1251 餐巾计划问题

    P1251 餐巾计划问题 题目描述 一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 iii 天需要 rir_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费 ...

  6. LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图

    #6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  7. Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)

    Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...

  8. 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】

    (题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...

  9. AC日记——餐巾计划问题 洛谷 P1084

    餐巾计划问题 思路: 氧气优化水过: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 4005 #define ...

  10. LOJ #6008. 「网络流 24 题」餐巾计划

    #6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_ir​i​​ 块餐巾.餐厅可以购买新的餐巾,每块餐 ...

随机推荐

  1. C# 如何在编译时将 dll 复制到 bin\Release 目录下

    下面假设 Project 名为 Gamma4RTD,需要调用的 dll 文件为 rtddll.dll.IDE 是 Visual Studio 2015 打开 Visual Studio 2015 -& ...

  2. webGis概念

    参考:https://blog.csdn.net/qq_36375770/article/details/80077533 参考:https://blog.csdn.net/BuquTianya/ar ...

  3. springboot中添加事务注解

    1.首先在service层中的方法前添加@Transactional @Service public class UserService { @Autowired private UserMapper ...

  4. 关于 go-fastdfs-web 的SpringBoot 后台管理

    1.问题的产生: 1.公司需要存储图片数据,采用Go语言的fastdfs,实现存储,我的职责就是部署,SpringBoot版本的管理平台. 2.当我看见代码之后我的内心是拒绝的,没有注释....... ...

  5. SoutceTree用户名或者密码输入错误解决方案

    soutceTree在拉取代码时候需要输入账户名或者密码,如果一时输入错了,可以这样修改: 1.找到这个目录:C:\Users\Administrator\AppData\Local\Atlassia ...

  6. jdbc操作mysql(三):利用注解封装

    案例五:利用注解封装 重复步骤 我们使用jdbc操作mysql时发现,操作不同表中数据,所写的方法基本相同:比如我们根据id向用户表添加数据,根据id删除商品表的数据,或者查询所有数据并用list集合 ...

  7. Java集合的使用

    创建和使用集合 定义:集合是一个可变数组 List集合存储有序可重复序列 点击查看详细代码 import java.util.*; public class List01 { public stati ...

  8. VMware虚拟机 + ubuntu16.04 Linux OpenCV打不开摄像头解决办法

    通过如下步骤,已解决:(不知哪个步骤是关键,全写下来) sudo apt-get update sudo apt-get upgrade 在Windows下先确认摄像头能正常读取. USB控制器选择U ...

  9. Git使用教程三

    2.远程仓库 线上仓库的操作学习以Github为例 2.1完成线上仓库创建 注意:仓库要求在当前账号下唯一   2.2 两种常规使用方式 2.2.1基于http协议 a.创建空目录,名称就称为shop ...

  10. 洛谷P2338 Bessie Slows Down S 题解

    题目 [USACO14JAN]Bessie Slows Down S 题解 这道题其实蛮简单的,不知道为什么难度划到了提高+,个人觉得这难度大概就是普及左右. 具体说说怎么做吧,简单模拟一下即可,始终 ...