上午的訓練結束了,thu acm小組集體去吃午餐,他們一行n人來到了著名的十食堂。這裡有兩個打飯的視窗,每個視窗同一時刻只能給乙個人打飯。由於每個人的口味(以及胃口)不同,所以他們要吃的菜各有不同,打飯所要花費的時間是因人而異的。另外每個人吃飯的速度也不盡相同,所以吃飯花費的時間也是可能有所不同的。
thu acm小組的吃飯計畫是這樣的:先把所有的人分成兩隊,並安排好每隊中各人的排列順序,然後一號隊伍到一號視窗去排隊打飯,二號隊伍到二號視窗去排隊打飯。每個人打完飯後立刻開始吃,所有人都吃完飯後立刻集合去六教地下室進行下午的訓練。
現在給定了每個人的打飯時間和吃飯時間,要求安排一種最佳的分隊和排隊方案使得所有人都吃完飯的時間盡量早。
假設thu acm小組在時刻0到達十食堂,而且食堂裡面沒有其他吃飯的同學(只有打飯的師傅)。每個人必須而且只能被分在乙個隊伍裡。兩個視窗是並行操作互不影響的,而且每個人打飯的時間是和視窗無關的,打完飯之後立刻就開始吃飯,中間沒有延遲。
現在給定n個人各自的打飯時間和吃飯時間,要求輸出最佳方案下所有人吃完飯的時刻。
輸入格式:
第一行乙個整數n,代表總共有n個人。
以下n行,每行兩個整數 ai,bi。依次代表第i個人的打飯時間和吃飯時間。
輸出格式:
乙個整數t,代表所有人吃完飯的最早時刻。
輸入樣例#1:
52 2
7 71 3
6 48 5
輸出樣例#1:
17所有輸入資料均為不超過200的正整數。
考慮貪心.
給出貪心條件證明:
令當前,有兩個人分別為 a,b,且滿足a 在 b 前為更優解.
排隊和吃飯時間分別為:
\[d_a,c_a,d_b,c_b
\]那麼當前如果 a 在 b前,所需要花費的時間即為:
\[d_a+max(c_a,d_b+c_b)
\]同理,如果 b 在 a 前,所需花費的時間為:
\[d_b+max(c_b,d_a+c_a)
\]因為滿足 a 在 b 前條件更優,即滿足關係:
\[d_a+max(c_a,d_b+c_b)
以上貪心是一列隊的做法,對於兩列,考慮dp.
**定義狀態:**
$$f[i][j]$$
表示到了第 i 個人,第1隊**打飯時間** (不包括吃飯)為 j 時的最小集合時間.
轉移方程
對於第 i 個人,它有兩種情況.
去第一隊
\[f[i+1][j+a[i+1].w]=min(f[i+1][j+a[i+1].d],max(j+a[i+1].d+a[i+1].c,f[i][j]));
\]去第二隊
\[f[i+1][j]=min(f[i+1][j],max(f[i][j],a[i+1].c+sum[i]-j+a[i+1].d));
\]其中 sum 代表排序之後的排隊字首和.
#includeusing namespace std;
const int maxn=208;
struct sja[maxn];
bool cmp(sj s,sj j)
int ans=19260817;
for(int i=0;i<=sum[n];i++)
ans=min(ans,f[n][i]);
cout
}
省選專練ZJOI2005午餐
這是個好題 考察dp優化,dp,貪心,01揹包變種。好首先對吃飯時間從大到小排序,因為一隊人打飯時長總和一樣。dp i,j 表示前i個人,第一組用j的時間。放第乙個揹包 dp i j min max dp i 1 j a i w j a i v 放第二個揹包 dp i j min max dp i ...
ZJOI 2005 夢幻摺紙
給乙個 n m 的網格圖,每個網格上有 1,n m 的數字,且每個都出現且恰好出現一次.顯然進行若干次摺疊直到剩下乙個 1 1 的小網格時,它在縱向上有 n m 層.那麼能否安排一種摺疊方案,使得這 n m 層從上往下的標號恰好為 1 到 n m 顯然每個縱向和橫向的格線都會被折到.我們觀察剩下的的...
ZJOI2005 沼澤鱷魚 題解報告
潘塔納爾沼澤地號稱世界上最大的一塊濕地,它地位於巴西中部馬托格羅索州的南部地區。每當雨季來臨,這裡碧波蕩漾 生機盎然,引來不少遊客。為了讓遊玩更有情趣,人們在池塘的 建設了幾座石墩和石橋,每座石橋連線著兩座石墩,且每兩座石墩之間至多只有一座石橋。這個景點造好之後一直沒敢對外開放,原因是池塘裡有不少危...