【题解】餐巾计划问题

【题解】餐巾计划问题

orz argent

一定要注意不要调到题目里的坑里来了,要记得脱离实际(大雾)。

建模方法:我觉得没什么好讲的,真的是灵感问题,此外,这个问题可以直接无源汇上下界网络流。但是我不会

graph LR

净1 --w=r,c=0--> T
净2 --w=r,c=0--> T
净3 --w=r,c=0--> T
净4 --w=r,c=0--> T

S --w=r,c=p--> 净1
S --w=r,c=p--> 净2
S --w=r,c=p--> 净3
S --w=r,c=p--> 净4

脏1--w=r,c=0--> 脏2
脏2--w=r,c=0--> 脏3
脏3--w=r,c=0--> 脏4

S --w=r,c=0--> 脏1
S --w=r,c=0--> 脏2
S --w=r,c=0--> 脏3
S --w=r,c=0--> 脏4

脏1 --w=inf,c=s or m --> 净2
脏1 --w=inf,c=s or m --> 净2

保证净到$T$一定满流即可。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;  typedef long long ll;
inline int qr(){
      register int ret=0,f=0;
      register char c=getchar();
      while(c<48||c>57)f|=c==45,c=getchar();
      while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
      return f?-ret:ret;
}

typedef const int& cont;
const int maxn=4e3+5;
struct E{
      int to,w,c,nx;
      E(){to=c=w=nx=0;}
      E(cont a,cont b,cont C,cont d){to=a;w=b;c=C;nx=d;}
}e[maxn<<4|1];
int head[maxn];
int cnt=1;
int T,S;
const int inf=0x3f3f3f3f;
queue< int > q;
inline void add(cont fr,cont to,cont w,cont c,cont f=1){
      e[++cnt]=E(to,w,c,head[fr]);
      head[fr]=cnt;
      if(f)add(to,fr,0,-c,0);
}

ll d[maxn];
int fl[maxn];
int last[maxn];
int in[maxn];
int n;
inline ll mincost(){
      ll ret=0;
      while(1){
	    for(register int t=1;t<=T;++t) d[t]=1LL<<60,fl[t]=0,in[t]=0;
	    d[S]=0;q.push(S);fl[S]=inf;
	    while(q.size()){
		  register int now=q.front();
		  q.pop();
		  in[now]=0;
		  for(register int t=head[now];t;t=e[t].nx){
			if(d[e[t].to]>d[now]+e[t].c&&e[t].w>0){
			      d[e[t].to]=d[now]+e[t].c;
			      fl[e[t].to]=min(e[t].w,fl[now]);
			      last[e[t].to]=t;
			      if(!in[e[t].to]) q.push(e[t].to);
			      in[e[t].to]=1;
			}
		  }
	    }
	    if(fl[T]==0)break;
	    ret+=d[T]*fl[T];
	    for(register int t=T;t!=S;t=e[last[t]^1].to)
		  e[last[t]].w-=fl[T],e[last[t]^1].w+=fl[T];
      }
      return ret;
}

int r[maxn];
int main(){

      n=qr();
      S=n+n+1;T=n+n+2;
      for(register int t=1,t1;t<=n;++t){
	    add(S,t,r[t]=t1=qr(),0);
	    add(t+n,T,t1,0);
	    if(t>1)add(t-1,t,inf,0);
      }
      int p,m,f,N,s;
      p=qr();m=qr();f=qr();N=qr();s=qr();
      for(register int t=1;t<=n;++t){
	    add(S,t+n,r[t],p);
	    if(t+m<=n) add(t,t+m+n,inf,f);
	    if(t+N<=n) add(t,t+N+n,inf,s);
      }
      printf("%lld\n",mincost());
      return 0;
}

原文地址:https://www.cnblogs.com/winlere/p/11241214.html

时间: 2024-10-27 09:07:52

【题解】餐巾计划问题的相关文章

餐巾计划问题

餐巾计划问题 Time Limit: 1000 MS  Memory Limit: 65536 KB Description 一个餐厅在相继的N 天里,每天需用的餐巾数不尽相同.假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧餐巾送到快洗部, 洗一块需m天,其费用为f 分:或者送到慢洗部,洗一块需n 天(n>m),其费用为s< f 分. 每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多 少块保存起来延期送洗.

线性规划与网络流10 餐巾计划问题

算法实现题 8-10 餐巾计划问题(习题 8-21)?问题描述:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分:或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分:或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s<f 分.每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天

【网络流24题】餐巾计划(图解)

LOJ 6008[网络流24题]餐巾计划 题解 一张图片说明建图方法: 解说: 这种建图方法完美区分开了"脏餐巾"和"干净餐巾"两种餐巾. 每天一定会有r[i]个脏餐巾,所以源点向每天的"脏餐巾"(图上used)连边,容量r[i],费用是0.另外,前一天的脏餐巾也可以留到下一天再处理,所以每天的used点向下一天的used点连一条边,容量INF,费用是0. 每天会需要r[i]个干净餐巾,所以每天的"干净餐巾"向汇点连边(图上n

【网络流24题】餐巾计划问题(最小费用最大流)

[网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 因为新买餐巾没有任何限制,并且随时可以买 所以直接从源点向每一天连边,容量为INF,费用为餐巾的价格 因为流要流出去,所以每个点向汇点连边,容量为每天的用量,费用为0 第二种,旧的拿去洗 首先考虑一下怎么算有多少旧的餐巾 每天用旧的餐巾的数量值一定的,不可能变多 因此从源点向这些点连边,容量为每天

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

餐巾计划问题 思路: 氧气优化水过: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 4005 #define maxque 1000005 #define INF 0x7fffffff #define ll long long ll n,head[maxn],E[maxque],V[maxque],W[maxque],F[maxque]; ll pi,qt,qc,st,sc,s,t,cnt=1,day[maxn],

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

#6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_ir?i?? 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分:或者把旧餐巾送到快洗部,洗一块需 M MM天,其费用为 F FF 分:或者送到慢洗部,洗一块需 N NN 天,其费用为 S SS 分(S<F S < FS<F). 每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.

P1251 餐巾计划问题

\(\color{#0066ff}{题目描述}\) 一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 i 天需要 \(r_i\) 块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分;或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分;或者送到慢洗部,洗一块需 n 天(\(n>m\)),其费用为 s 分(\(s<f\)). 每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.但是每天洗好的餐巾和

网络流24题 餐巾计划问题

题目描述 一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同.假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分:或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分:或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s<f 分.每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量.试设计一个算法为餐厅合理地安排好 N 天中餐

【Codevs1237&amp;网络流24题餐巾计划】(费用流)

题意:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同. 假设第 i 天需要 ri块餐巾(i=1,2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分: 或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分: 或者送到慢洗部,洗一块需 n 天(n>m),其费用为 s<f 分.每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗. 但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量.试设计一个算法为餐厅合理地安排好 N 天