餐巾計畫問題
time limit: 1000 ms memory limit: 65536 kb
description
乙個餐廳在相繼的n 天裡,每天需用的餐巾數不盡相同。假設第i天需要ri塊餐巾(i=1, 2,…,n)。餐廳可以購買新的餐巾,每塊餐巾的費用為p分;或者把舊餐巾送到快洗部, 洗一塊需m天,其費用為f 分;或者送到慢洗部,洗一塊需n 天(n>m),其費用為s< f 分。 每天結束時,餐廳必須決定將多少塊髒的餐巾送到快洗部,多少塊餐巾送到慢洗部,以及多 少塊儲存起來延期送洗。但是每天洗好的餐巾和購買的新餐巾數之和,要滿足當天的需求量。 試設計乙個演算法為餐廳合理地安排好n 天中餐巾使用計畫,使總的花費最小。 程式設計任務: 程式設計找出乙個最佳餐巾使用計畫.
input
由檔案input.txt提供輸入資料。檔案第1 行有6 個正整數n,p,m,f,n,s。n 是要安排餐巾 使用計畫的天數;p 是每塊新餐巾的費用;m 是快洗部洗一塊餐巾需用天數;f 是快洗部洗 一塊餐巾需要的費用;n是慢洗部洗一塊餐巾需用天數;s是慢洗部洗一塊餐巾需要的費用。 接下來的n 行是餐廳在相繼的n 天裡,每天需用的餐巾數。
output
程式執行結束時,將餐廳在相繼的n 天裡使用餐巾的最小總花費輸出到檔案output.txt 中。
樣例輸入:
3 10 2 3 3 2 5 6 7
樣例輸出:
145
source
線性規劃與網路流24題
題解:
首先看到這道題的時候並沒有想到正解,但至少是乙個最小費用流。
一開始的思路是拆點,然後x和y之間連一條流量為a[i]費用為0的邊,x分別和y+d1和y+d2建邊,源點和匯點分別和x和y建邊。wa到不行。
沉思兩天之後終於想到了正解,把天數拆成x和y,y用來表示直接買的餐巾,x用來表示洗完之後的餐巾。因此只需要將x和y+d1和y+d2建邊就可以了,當然y和y+1也要建邊,因為洗完的餐巾是可以繼續傳下去的。最後就只要將源點和xy分別建邊,匯點和y建邊就可以了。
**如下:
#include#include#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
intn,m;
struct
node
edge[
400001
];int sze=1,head[5001
];long
long a[5001
];void putin(int
from,int to,long
long cap,long
long
cost)
void
in(int
from,int to,long
long cap,long
long
cost)
long
long ans,f[5001
];int pre[5001],vis[5001
];bool bfs(int src,int
des)
queue
mem;
mem.push(src);
f[src]=0;vis[i]=1
;
while(!mem.empty())}}
}if(f[des]==1e18)return0;
else
return1;
}void change(int src,int
des)
x=des;
while(x!=src)
}void mincostflow(int src,int
des)
intmain()
mincostflow(
0,n*2+1
); cout
}
餐巾計畫問題
乙個餐廳在相繼的n 天裡,每天需用的餐巾數不盡相同。假設第i天需要ri塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用 為p分 或者把舊餐巾送到快洗部,洗一塊需 m天,其費用為 f 分 或者送到慢洗部,洗一塊需 n 天 n m 其費用為 s這道題是一道最小費用最大流的題目,然而有一些神犇...
餐巾計畫問題
乙個餐廳在相繼的n天裡,第i天需要ri塊餐巾 i l,2,n 餐廳可以從三種途徑獲得餐巾。1 購買新的餐巾,每塊需p分 2 把用過的餐巾送到快洗部,洗一塊需m天,費用需f分 f p 如m l時,第一天送到快洗部的餐巾第二天就可以使用了,送慢洗的情況也如此。3 把餐巾送到慢洗部,洗一塊需n天 n m ...
題解 餐巾計畫問題
傳送門 乙個餐廳在相繼的 nnn 天裡,每天需用的餐巾數不盡相同。假設第 iii 天需要 rir iri 塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為 ppp 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 nnn 天 n mn mn m ...