time limit: 1 sec
memory limit: 128 mb
submit: 5655
solved: 2383 [
submit][
status][
discuss]
同一時刻有n位車主帶著他們的愛車來到了汽車維修中心。維修中心共有m位技術人員,不同的技術人員對不同
的車進行維修所用的時間是不同的。現在需要安排這m位技術人員所維修的車及順序,使得顧客平均等待的時間最
小。 說明:顧客的等待時間是指從他把車送至維修中心到維修完畢所用的時間。
第一行有兩個m,n,表示技術人員數與顧客數。 接下來n行,每行m個整數。第i+1行第j個數表示第j位技術人
員維修第i輛車需要用的時間t。
最小平均等待時間,答案精確到小數點後2位。
2 23 2
1 41.50
資料範圍: (2<=m<=9,1<=n<=60), (1<=t<=1000)
題目思路:
首先分析問題,最終狀態應該是把來修車的n個人分成m隊,也就是每個修車師傅面前排一隊人,其中這個隊裡的第k個人等待時間是k*這個人在該技術工人這裡修車的時間t;
那麼,也就是說把這n個人分配到m個隊中的某個位置上,每個人只分配一次,每個位置只有乙個人。
因此,可以用網路流來解決。圖中共有1個源點,1個匯點,n個節點代表n個人(人節點 ),n*m個節點代表每個佇列中的每個位置(位置節點)。從源點向每個人節點連一條容量為1,費用是0的邊;從每個人節點向每個位置節點連一條邊,容量為1,費用是這個人站在這個佇列的這個位置時的花費;每個位置節點向匯點連一條容量是1,費用是0的邊。跑一遍源點到匯點的最小費用最大流得到答案。
看了一下status,速度差距明顯,查了一下網上題解的做法,認為有必要學一下zkw費用流。
#pragma warning(disable:4786)
#pragma comment(linker, "/stack:102400000,102400000")
#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long
#define for(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define lson l,m,x<<1
#define rson m+1,r,x<<1|1
using namespace std;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const double pi = acos(-1.0);
const double eps=1e-6;
const int maxn = 700;
int c[65][15];
struct edge
;struct mcmf
void addedge(int from , int to , int cap , int cost);
edge e2 = ;
edges.push_back(e1);
edges.push_back(e2);
int m = edges.size();
g[from].push_back(m - 2);
g[to].push_back(m - 1);
}bool bellmanford(int s , int t , int & flow , ll & cost)}}
}if(d[t] == inf) return false;
flow += a[t];
cost += (ll)a[t] * (ll)d[t];
int u = t;
while(u != s)
return true;
}ll mincost(int s , int t , int & flow)
}g;int main()
}g.init(2 + n * m + n);
int source = 1 , sink = 2 + n * m + n;
for(int i = 1 ; i <= n; i++)}}
for(int j = 1 ; j <= m ; j++)
}int flow ;
double ans = (double)g.mincost(source , sink , flow);
ans = ans / n;
printf("%.2lf\n" , ans);
}return 0;
}
bzoj1070 修車)(費用流)
建圖重要。m個工人,n輛車 源點向每輛車連一條容量為1費用為0的邊。把每個工人拆成n個,第i個工人的第j個節點表示,第i個工人修倒數j輛車。每輛車向這n m個工人連一條容量為1費用為這個工人修這輛車的時間 這個工人倒數第幾個修這輛車。因為修一輛車只會使在它後面修的都 修這輛車的時間。我服了,爛費用流...
BZOJ 1070 修車 費用流
同一時刻有n位車主帶著他們的愛車來到了汽車維修中心。維修中心共有m位技術人員,不同的技術人員對不同 的車進行維修所用的時間是不同的。現在需要安排這m位技術人員所維修的車及順序,使得顧客平均等待的時間最 小。說明 顧客的等待時間是指從他把車送至維修中心到維修完畢所用的時間。第一行有兩個m,n,表示技術...
BZOJ 1070 修車 神奇網路流
傳送門 題意 中文題。solution 因為這道題每個工人可以維修多個汽車,所以說沒法直接用費用流,我們先想乙個簡單的貪心思路 假如說我們考慮乙個工人的情況,那麼他修車所需的時間為 t1 t1 t2 t1 t2 t3 t 1 tn 變形一下該式 n t1 n 1 t2 tn 容易看出,我們修車的順序...