hdu 2883 kebab(離散化+最大流)
題意
:
給定n個顧客,第i號顧客在si到達,點了ni個羊肉串,每個羊肉串需要ti個時間烤好。顧客想要在ei得到,乙個烤爐只烤m串。問你是否能滿足所有顧客的要求?能的話輸出「yes」,否則輸出「no」。
注意:這ni個羊肉串可以被分開來考,乙個單獨的羊肉串也能分開烤(比如乙個單獨的羊肉串需要ti時間,我們把它分成ti份同時烤的話,那麼乙個羊肉串可以在1個單位時間內拷完)
注意
:每個顧客的任務必須在
(si,ei]
半開半閉的區間內完成
.
分析
:
本題與hdu3572有點類似:
其實本題的本質就是hdu3572的思想,每個顧客其實提出的是需要ni*ti個單位時間任務(甚至可以在
1個時刻同時完成
,因為一串羊肉串都可以在
1個時刻烤完),但是你每個時間只能提供m個單位時間做任務. 但是這個題目的時間點覆蓋1到100w,明顯不能再把每個單獨的時間看成乙個點了,所以這題要把每個不重疊的子時間區間看成乙個點.
首先讀入所有任務的開始時間s[i]和結束時間e[i],然後對這些時間點排序,去重,得到cnt個時間點,然後我們就能得到cnt-1個半開半閉的子時間區間(前後兩個子區間邊界不重疊
,且所有區間連起來正好覆蓋了原來的整個大時間區間
,該大時間區間也是半開
,半閉的).
建圖: 源點s編號0, n個任務編號1到n, cnt-1個區間編號n+1到n+cnt, 匯點t編號n+cnt+1.
源點到每個任務i有邊(s,i,ni*ti)
每個時間區間j到匯點有邊(j,t, 該區間覆蓋的單位時間點數)
如果任務i包含時間區間j,那麼有邊(i,j,inf)
求最大流,看最大流 是否== 所有任務需要的單位時間之和即可.
ac**:
#include#include#include#include#define inf 1e9
using namespace std;
const int maxn=700;//之前這裡只寫10+5,一直tle,真是悲劇
struct edge
edge(int from,int to,int cap,int flow):from(from),to(to),cap(cap),flow(flow){}
int from,to,cap,flow;
//cap是容量 flow是流量
};struct dinic
void addedge(int from,int to,int cap)
bool bfs()}}
return vis[t];//表示能否到大t點 不能的話返回false
}int dfs(int x,int a)
}return flow;
}int maxflow()
return flow;
}}dc;
int num[maxn],s[maxn],e[maxn],t[maxn];
int a[maxn<<1];
int main()
sort(a,a+cnt);
cnt=unique(a,a+cnt)-a;
for(int i=1;i
hdu2883 kebab (最大流 離散化)
題目大意 你在經營乙個烤肉店,給你n個客人,每個客人都要求有ni的肉串,並且不要客人要求的肉串的一串烤製時間是不一樣的 為ti 客人將在si到,並且在ei的時候走。你有乙個烤肉機,每天可以烤製m個串,並且每個串是可以分不連續的幾天烤製。題解 從資料規模和模型很容易看出來是一道網路流的題目,hdu上還...
HDU 2883 kebab 最大流建模
題意 乙個燒烤攤,最多同時考m個串,現在給n個顧客資訊,分別是到達燒烤店的時間,和他要走的時間,以及需要考的串的個數,和每個串烤熟需要的時間。問給定n個顧客,是否能夠滿足所有顧客的需求。思路從超級源點連邊到每個顧客,容量為ni ti,對於輸入的時間區間,將所有點排序去重,然後每個區間連邊到超級匯點容...
HDU 2883 kebab 最大流,滿流
題意 有乙個人有個烤架,他的烤架同時可以烤m個串,有n個顧客會過來買,si,ni,ei,ti分別表示當前顧客來的開始時間,需要烤串的數量,最晚走的時間,每個烤串需要烤的時間。思路 此題同 hdu 3572,比3572多乙個離散化 s 時間 顧客 t 因為此題時間範圍太大,所以需要離散化,然後時間是乙...