题解 P4480 【[BJWC2018]餐巾计划问题】

一道关于餐厅餐巾管理的问题,涉及不同的清洗店和费用。原问题可通过网络流解决,但面对更大数据范围,需要采用新的策略。当快洗店费用更高时,采用三分法结合队列优化求解;若快洗店更便宜,则全部选择快洗。代码实现具有一定挑战性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题和网络流24题中的餐巾计划的确不一样,[BJWC2018]餐巾计划问题的数据范围更大。

一个餐厅在相继的n天里,每天需用的餐巾数不尽相同。假设第i天(i=1,2,…,n)需要ri块餐巾。餐厅可以在任意时刻购买新的餐巾,每块餐巾的费用为p。

使用过的旧餐巾,则需要经过清洗才能重新使用。把一块旧餐巾送到清洗店A,需要等待m1天后才能拿到新餐巾,其费用为c1;把一块旧餐巾送到清洗店B,需要等待m2天后才能拿到新餐巾,其费用为c2。

例如,将一块第k天使用过的餐巾送到清洗店A清洗,则可以在第k+m1天使用。

对于50%的数据,我们有一个很经典的网络流做法:餐巾计划问题

但是数据规模扩大后就显然不能用网络流求解了。

分两种情况:

1.快洗店更贵:

考虑到先买和后买餐巾所对答案和过程不会造成影响,且当买餐巾c条达到最优解时,显然c+k的花费比c+k+1的花费更少。

并且不难感性证出c-k的花费比c-k-1的花费更少(会在最优情况下多次使用快洗店的餐巾使得钱变多)。

因此我们可以三分求解。

最便宜的显然是先使用新的毛巾,等到没了的时候使用慢洗店的,最差使用快洗店的得出答案,使用队列维护一下即可(虽然这么说,也是挺恶心的,我对着别人的代码调了3h才过,可能现在让我解释代码都解释不明白。)

2.快洗点更便宜:

那就都快洗,这是显然的。

这是可爱的代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=200010;
const int INF=2147483647;
inline int read(){
   
    int X=0,w=1;char ch=0;
    while(ch<'0'||ch>'9'){
   if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')X=(X<<1)+(X<<3)+ch-'0'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值