P4231理髮時間

2021-08-03 21:32:29 字數 1823 閱讀 5738

問題描述

何老闆開了一家理髮店,店裡有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...