P1251 餐巾计划问题

题目描述

一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同。假设第 iii 天需要 rir_iri​块餐巾( i=1,2,...,N)。餐厅可以购买新的餐巾,每块餐巾的费用为 p 分;或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分;或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s 分(s<f)。

每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。

试设计一个算法为餐厅合理地安排好 N 天中餐巾使用计划,使总的花费最小。编程找出一个最佳餐巾使用计划。

输入输出格式

输入格式:

由标准输入提供输入数据。文件第 1 行有 1 个正整数 NNN,代表要安排餐巾使用计划的天数。

接下来的 NNN 行是餐厅在相继的 NNN 天里,每天需用的餐巾数。

最后一行包含5个正整数p,m,f,n,s。p 是每块新餐巾的费用; m 是快洗部洗一块餐巾需用天数; f是快洗部洗一块餐巾需要的费用; n是慢洗部洗一块餐巾需用天数; s是慢洗部洗一块餐巾需要的费用。

输出格式:

将餐厅在相继的 N 天里使用餐巾的最小总花费输出

输入输出样例

输入样例#1: 复制

3
1 7 5
11 2 2 3 1
输出样例#1: 复制

134

说明

N<=2000

ri<=10000000

p,f,s<=10000

时限4s

看到4S,顿时随便打代码,基本上啥优化都没有,就是莫名其妙被卡了好久,

和题解一样(我用多数组,题解是结构体),然后WA了好多……

最后一改成结构体就AC了,我也是很懵。

很显然,就是最大流的最小费用,

把每天拆成两个点,看成上下午。

上午负责洗毛巾,下午负责送毛巾……

AC代码如下:

#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
typedef long long LL;
,M=;
const int INF=0x3f3f3f3f;
LL n,p,m1,m2,f1,f2,head[N],cnt=,dis[N],last[N],r[N],s,t;
bool inq[N];
struct Edge {
LL u,v,cap,cost,nxt;
 } e[M];
void add(LL u,LL v,LL cap,LL cost) {
    e[cnt].u=u;
    e[cnt].v=v;
    e[cnt].cap=cap;
    e[cnt].cost=cost;
    e[cnt].nxt=head[u];
    head[u]=cnt++;

    e[cnt].u=v;
    e[cnt].v=u;
    e[cnt].cap=;
    e[cnt].cost=-cost;
    e[cnt].nxt=head[v];
    head[v]=cnt++;
}
bool SPFA() {
    memset(inq,,sizeof(inq));
    memset(last,-,sizeof(last));
    memset(dis,0x3f3f3f3f,sizeof(dis));
    queue<LL> Q;
    Q.push(s);
    inq[s]=; dis[s]=;
    while (!Q.empty()) {
        LL u=Q.front(); Q.pop(); inq[u]=;
        ;i=e[i].nxt) {
            LL v=e[i].v;
            if (e[i].cap&&dis[v]>dis[u]+e[i].cost) {
                dis[v]=dis[u]+e[i].cost;
                last[v]=i;
                if (!inq[v])
                {
                    Q.push(v);
                    inq[v]=;
                }
            }
        }
    }
   ;
}
LL MCMF() {
    LL minflow,mincost=;
    while (SPFA()) {
        minflow=INF+;
        ;i=last[e[i].u])
            if (e[i].cap<minflow) minflow=e[i].cap;
        ;i=last[e[i].u]) {
            e[i].cap-=minflow;
            e[i^].cap+=minflow;
        }
        mincost+=dis[t]*minflow;
    }
    return mincost;
}

int main() {
    memset(head,-,sizeof(head));
    scanf("%lld",&n);
    ;i<=n;i++)
    scanf("%lld",&r[i]);
    scanf("%lld%lld%lld%lld%lld",&p,&m1,&f1,&m2,&f2);
    s=,t=*n+;
    ;i<=n;i++) {
        add(s,i,r[i],);
        add(i+n,t,r[i],);
        add(s,i+n,INF,p);
        <=n) add(i,i+,INF,);
        if (i+m1<=n) add(i,i+n+m1,INF,f1);
        if (i+m2<=n) add(i,i+n+m2,INF,f2);
    }
    printf("%lld",MCMF());
    ;
}

P1251 餐巾计划问题的更多相关文章

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

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

  2. P1251 餐巾计划问题 网络流

    P1251 餐巾计划问题 #include <bits/stdc++.h> using namespace std; typedef long long ll; , inf = 0x3f3 ...

  3. 网络流之最小费用最大流 P1251 餐巾计划问题

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...

  4. 网络流24题 P1251 餐巾计划问题 拆点

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...

  5. 【Luogu】P1251餐巾计划(上下界费用流)

    题目链接 学了一下上下界费用流,似乎很nb.但是我说得不好,所以这里给出博客链接. 某dalao的博客 然后这道题的解法就是先用上下界费用流的建图方式连早上和晚上之间的那条边,保证当天一定会有r条或以 ...

  6. 洛谷P1251 餐巾计划问题(费用流)

    传送门 不得不说这题真是思路清奇,真是网络流的一道好题,完全没想到网络流的建图还可以这么建 我们把每一个点拆成两个点,分别表示白天和晚上,白天可以得到干净的餐巾(购买的,慢洗的,快洗的),晚上可以得到 ...

  7. [洛谷P1251]餐巾计划问题

    题目大意:一个餐厅N天,每天需要$r_i$块餐巾.每块餐巾需要p元,每天用过的餐巾变脏,不能直接用.现在有快洗店和慢洗店,快洗店洗餐巾需要m天,每块花费f元:慢洗店洗餐巾需要n天,每块餐巾s元(m & ...

  8. 洛谷P1251 餐巾计划问题(最小费用最大流)

    题意 一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径 1.以$p$的费用买 2.以$f$的费用送到快洗部,并在$m$天后取出 3.以$s$的费用送到慢洗部,并在$n$天后取出 问满足 ...

  9. 洛谷 P1251 餐巾计划问题【最小费用最大流】

    建图细节比较多,对于每个点i,拆成i和i',i表示用的餐巾,i'表示脏餐巾,连接: (s,i,r[i],p)表示在这一天买新餐巾 (i,t,r[i],0)表示这一天用了r[i]的餐巾 (s,i+n,r ...

随机推荐

  1. Netty对Protocol Buffer的支持(七)

    Netty对Protocol Buffer的支持(七) 一.简介 在上一篇博文中笔者已经介绍了google的Protocol Buffer的使用,那么本文笔者就开始介绍netty对Protocol B ...

  2. PyCharm/WebStorm遇到Cannot start internal HTTP server

    在开始学习html.css的时候,使用PyCharm 的模拟链接到服务器的时候总是遇到 网上也没有遇到合适的解决方案,遂下载了WebStorm,希望能通过安装配置好一些设置,结果依然不行,只有从头分析 ...

  3. [Spark内核] 第32课:Spark Worker原理和源码剖析解密:Worker工作流程图、Worker启动Driver源码解密、Worker启动Executor源码解密等

    本課主題 Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系 [引言部份:你希望读者 ...

  4. ETL实践--kettle转到hive

    ETL实践--kettle只做源数据的抽取,其他数据转换转到hive上. 1.用hive代替kettle的数据关联的原因 (1).公司之前的数据ELT大量使用了kettle.用kettle导原始数据速 ...

  5. 多个JDK使用批处理命令切换JDK版本

    本篇博客参考的链接 http://blog.csdn.net/hu199055/article/details/70145389 https://www.cnblogs.com/xdp-gacl/p/ ...

  6. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (2)

    Github源码地址是: https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scra ...

  7. TLD算法原理2--学习理解之(三)

    TLD(Tracking-Learning-Detection)是一种新的单目标长时间(long term tracking)跟踪算法.该算法与传统跟踪算法的显著区别在于将传统的跟踪算法和传统的检测算 ...

  8. python的while循环

    age_of_laochuanzhang = 56 conut = 0 while True: if conut == 3: print("输入次数上限") break age = ...

  9. HDU 2689 Sort it【树状数组】

    Sort it Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  10. Java学习之封装

    Java是一种面向对象的编程语言,对于面向对象的编程语言中有一种思想叫做封装. 封装是一种很重要的思想,今天在看教学视频时,觉得视频中的例子很好的解释了封装的重要性,能够提高程序的健壮性. 视频中以人 ...