問題描述
何老闆開了一家理髮店,店裡有m名髮型師。
今天,信競班的n名同學一起同時來到何老闆的店,每個同學都要理髮,並且每個同學的髮型要求都不相同。
每個髮型師處理不同的髮型所需時間可能不同。何老闆想要給大家安排乙個合理的理髮順序,使得大家等候的總時間最少。乙個同學的等待時間是指從他到店開始到理髮完畢所用的時間。
輸入格式
第一行有兩個整數m和n。
接下來乙個n*m的整數矩陣,其中第i行第j列的數字表示第i號同學的髮型由第j號理髮師來處理所需的時間。
輸出格式
乙個整數,表示等候的最少總時間。
樣例輸入 1
2 2
3 2
1 4樣例輸出 1
樣例輸入 2
3 9
42 2 53
16 66 94
37 55 99
77 79 11
9 2 95
19 49 10
5 19 91
36 14 95
100 61 54
樣例輸出 2
提示對於100%的資料:2<=m<=10,1<=n<=100,1<=單個人理髮的時間<=1000
排隊等候模型,將m個理髮師拆成n個點,其中第k個點代表的是第n個人在倒數第k個所產生的時間消耗!!因為在其之後的每乙個人都會產生多出的time[i][j]的時間消耗,所以從每個點向每個拆出的點連一條費用為time[i][j*k的邊,容量為1,再從每個拆出的點向匯點連一條容量為1費用為0的邊。
跑一次最小費用流。
注意陣列範圍至少100萬!
注意spfa()中每取出一次front()數要取消mark,一開始怎麼都調不對就是因為這。。
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define maxn 1000009
#define maxn1 1005
#define inf 0xfffffff
int n,m;
int next[maxn],end[maxn],len[maxn],last[maxn];
int con[maxn],path[maxn1*5],p2[maxn1*5];
int ma[maxn1][maxn1];
int dis[maxn1*5];
int maxflow,mincost;
int cnt=1;
int st,en;
bool mark[maxn1*5];
queue
q;bool spfa()}}
}if(dis[en]!=inf) return
true;
else
return
false;
}void insert(int x,int y,int z,int w)
void addflow()
maxflow+=minn;
mincost+=minn*dis[en];
for(int i=en;i;i=path[i])
}int main()
}en=n+n*m+1;
for(i=1;i<=n;i++)
for(i=1;i<=n;i++)}}
for(i=1;i<=m;i++)
}while(spfa()) addflow();
cout
<}
洛谷P4231 三步必殺
題目描述 n 個柱子排成一排,一開始每個柱子損傷度為0。接下來勇儀會進行 m 次攻擊,每次攻擊可以用4個引數 l r s e 來描述 表示這次攻擊作用範圍為第 l 個到第 r 個之間所有的柱子 包含 l r 對第乙個柱子的傷害為 s 對最後乙個柱子的傷害為 e 攻擊產生的傷害值是乙個等差數列。若 l...
洛谷 P4231 三步必殺
乙個操作的過程是這樣的 a 0 0 0 s s d s 2d e 2d e d e 0 0 0 原陣列 b 0 0 0 s d d d d d e 0 0 差分陣列1 c 0 0 0 s d s 0 0 0 0 e d e 0 差分陣列2 乙個如此詭異的操作,還是被神奇的差分陣列消滅了。所以對於每個...
洛谷P4231 三步必殺 差分
題意 有m次詢問每次給一段區間加上個等差序列 思路 題目資料很大,若是用線段樹或樹狀陣列則tle,所以我們想到了進行二次差分 l l 1 r r 1 r 2 s d s 0 e d e 然後進行兩次字首和 include using namespace std typedef long long l...