BZOJ1899 午餐(動態規劃)

2021-08-14 18:32:01 字數 1393 閱讀 6002

bzoj

我太弱了 這種d

p 完全做不動。。

首先,感性理解一些

如果所有人都要早點走,

那麼,吃飯時間長的就先吃

吃飯時間短的就晚點吃

所以,按照吃飯時間排序

我們不難得出乙個每個人吃完飯的時間

之和前面所有人的打飯的時間和有關

所以 f[i

][j]

[k] 表示當前做到第

i 個人,第一列,第二列前面的人的打飯時間之和分別為j,

k時,最後乙個人吃完飯的最小時間

因為人的順序我們是知道的 所以j

+k是乙個定值,是所有人打飯時間的字首和

因此我們只需要記錄其中乙個

所以,狀態是f[

i][j

] 表示當前做到第

i 個人,

第一列隊伍前面所有人打飯的時間和是j時

最後乙個人吃完飯的最小時間

如果把這個人放在第一列 f[

i][j

]=mi

n(f[

i][j

],ma

x(f[

i−1]

[j−g

et[i

]],j

+eat

[i])

) 這個應該不難理解

另外乙個,把這個人放在第二列 f[

i][j

]=ma

x(f[

i−1]

[j],

sum[

i]−j

+eat

[i])

這題應該是乙個很顯然的dp

但是我卻做不出來

我果然太弱了

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define max 210

inline

int read()

struct peop[max];

int s[max],ans=2e9;

int f[max][max*max],n;

bool

operator

<(peo a,peo b)

int main()

}for(int i=0;i<=s[n];++i)ans=min(f[n][i],ans);

printf("%d\n",ans);

return

0;}

luogu P2577午餐 動態規劃

這其實是乙個揹包問題的變形,如果只有乙個視窗的話,對於排隊打飯的時間是固定的,那麼只要按照誰吃的慢誰先上就可以得出最優值。這道題有兩個視窗,貪心的方法還是一樣的,但是需要考慮分配問題。設dp i j k 下標 前i個人在視窗1花了j的打飯時間,在視窗2花了k的打飯時間。值 前i個人最小的用餐時間。設...

ZJOI2005 午餐 貪心,動態規劃

上午的訓練結束了,thu acm小組集體去吃午餐,他們一行n人來到了著名的十食堂。這裡有兩個打飯的視窗,每個視窗同一時刻只能給乙個人打飯。由於每個人的口味 以及胃口 不同,所以他們要吃的菜各有不同,打飯所要花費的時間是因人而異的。另外每個人吃飯的速度也不盡相同,所以吃飯花費的時間也是可能有所不同的。...

BZOJ1037動態規劃

資料範圍很小,可以用4維儲存下前i個男孩j個女孩,從這一位往前的所有點中男 女的差最大為x,女 男為y的方案數 主動遞推 f i 1 j x 1 max y 1 0 f i j x y f i j 1 max x 1 0 y 1 f i j x y 最後答案為 sigma x sigma y f n...