題目描述
上午的訓練結束了,thu acm小組集體去吃午餐,他們一行n人來到了著名的十食堂。這裡有兩個打飯的視窗,每個視窗同一時刻只能給乙個人打飯。由於每個人的口味(以及胃口)不同,所以他們要吃的菜各有不同,打飯所要花費的時間是因人而異的。另外每個人吃飯的速度也不盡相同,所以吃飯花費的時間也是可能有所不同的。
thu acm小組的吃飯計畫是這樣的:先把所有的人分成兩隊,並安排好每隊中各人的排列順序,然後一號隊伍到一號視窗去排隊打飯,二號隊伍到二號視窗去排隊打飯。每個人打完飯後立刻開始吃,所有人都吃完飯後立刻集合去六教地下室進行下午的訓練。
現在給定了每個人的打飯時間和吃飯時間,要求安排一種最佳的分隊和排隊方案使得所有人都吃完飯的時間盡量早。
假設thu acm小組在時刻0到達十食堂,而且食堂裡面沒有其他吃飯的同學(只有打飯的師傅)。每個人必須而且只能被分在乙個隊伍裡。兩個視窗是並行操作互不影響的,而且每個人打飯的時間是和視窗無關的,打完飯之後立刻就開始吃飯,中間沒有延遲。
現在給定n個人各自的打飯時間和吃飯時間,要求輸出最佳方案下所有人吃完飯的時刻。
輸入輸出格式
輸入格式:
第一行乙個整數n,代表總共有n個人。
以下n行,每行兩個整數 ai,bi。依次代表第i個人的打飯時間和吃飯時間。
輸出格式:
乙個整數t,代表所有人吃完飯的最早時刻
這題資料範圍比較小,適合採用模擬退火演算法,於是先寫一發模擬退火演算法ac掉
//模擬退火亂搞
#include
#include
#include
#include
#include
using namespace std;
struct per
}q[505];
int n,ans=
0x7f7f7f7f
;int q1[
505]
,q2[
505]
,t1,t2;
void
update()
sum =0;
for(
int i =
1; i <= t2; i ++
) ans =
min(ans,
max(ans1,ans2));
}int
main()
sort
(q+1
,q+1
+n);
int ansn =0;
for(
int i =
1; i <= n ; i ++
)update()
;srand
(23333);
for(
int j =
1; j <=
30000
; j ++
)else
}update()
;}cout<}
下面是正解dp
#include
#include
#include
#include
#include
using namespace std;
struct per
}q[505];
int n,sum[
505]
,f[505][
40006];
intmain()
memset
(f,0x3f
,sizeof
(f))
; f[0]
[0]=
0;sort
(q+1
,q+1
+n);
for(
int i =
1; i <= n; i ++
) sum[i]
=sum[i-1]
+q[i]
.wait;
for(
int i =
1; i <= n; i ++
)for
(int j =
0; j <= sum[i-1]
;j ++)if
(f[i-1]
[j]!=
0x3f3f3f3f
)int ans =
0x7f7f7f7f
;for
(int i =
0; i<= sum[n]
; i ++
) ans =
min(f[n]
[i],ans)
;printf
("%d"
,ans)
;}
OI刷題記錄
2014 4 18 poj3264 bzoj1699 balanced lineup rmq 2014 4 19 bzoj1012 jsoi2008 最大數maxnumber noi2004 鬱悶的出納員 bzoj3224 tyvj 1728 普通平衡樹 2014 4 20 bzoj1862 105...
面試刷題記錄
寫一段 判斷乙個包括 的表示式是否合法 注意看樣例的合法規則。給定乙個表示式a,請返回乙個bool值,代表它是否合法。測試樣例 a b 5 4 返回 true 測試樣例 a b 5 4 返回 false include vector include iostream using namespace ...
刷題記錄 2015 11 14
現在每天做的題都記錄一下,免得不知道自己在幹什麼。poj2406 用next陣列的定義求迴圈節 poj3261 字尾陣列 題 spoj705 同上,這題我wa了幾次,結果發現 我以為字串只有大寫字母,其實有小寫。如下 poj2406 author duyixian date 2015 11 14 1...