time limit: 10 sec memory limit: 259 mb
submit: 931 solved: 556
[submit][status][discuss]
小f 的學校在城市的乙個偏僻角落,所有學生都只好在學校吃飯。學校有乙個食堂,雖然簡陋,但食堂大廚總能做出讓同學們滿意的菜餚。當然,不同的人口味也不一定相同,但每個人的口味都可以用乙個非負整數表示。由於人手不夠,食堂每次只能為乙個人做菜。做每道菜所需的時間是和前一道菜有關的,若前一道菜的對應的口味是a,這一道為b,則做這道菜所需的時間為(a or b)-(a and b),而做第一道菜是不需要計算時間的。其中,or 和and 表示整數逐位或運算及逐位與運算,c語言中對應的運算子為「|」和「&」。學生數目相對於這個學校還是比較多的,吃飯做菜往往就會花去不少時間。因此,學校食堂偶爾會不按照大家的排隊順序做菜,以縮短總的進餐時間。雖然同學們能夠理解學校食堂的這種做法,不過每個同學還是有一定容忍度的。也就是說,隊伍中的第i 個同學,最多允許緊跟他身後的bi 個人先拿到飯菜。一旦在此之後的任意同學比當前同學先拿到飯,當前同學將會十分憤怒。因此,食堂做菜還得照顧到同學們的情緒。現在,小f 想知道在滿足所有人的容忍度這一前提下,自己的學校食堂做完這些菜最少需要多少時間。
第一行包含乙個正整數c,表示測試點的資料組數。每組資料的第一行包含乙個正整數n,表示同學數。每組資料的第二行起共n行,每行包含兩個用空格分隔的非負整數ti和bi,表示按隊伍順序從前往後的每個同學所需的菜的口味和這個同學的忍受度。每組資料之間沒有多餘空行。
包含c行,每行乙個整數,表示對應資料中食堂完成所有菜所需的最少時間。25
5 24 1
12 0
3 32 2
25 0
4 016
1對於第一組資料:同學1允許同學2或同學3在他之前拿到菜;同學2允許同學3在他之前拿到菜;同學3比較小氣,他必須比他後面的同學先拿菜…… 一種最優的方案是按同學3、同學2、同學1、同學4、同學5做菜,每道菜所需的時間分別是0、8、1、6及1。 【資料規模和約定】對於30%的資料,滿足1 ≤ n ≤ 20。對於100%的資料,滿足1 ≤ n ≤ 1,000,0 ≤ ti ≤ 1,000,0 ≤ bi ≤ 7,1 ≤ c ≤ 5。存在30%的資料,滿足0 ≤ bi ≤ 1。存在65%的資料,滿足0 ≤ bi ≤ 5。存在45%的資料,滿足0 ≤ ti ≤ 130。
資料中忍受度bi<=7,
可以往狀態壓縮上面想想
;只要知道當前處理的位置以及當前位置的情況
,就可以表示整個狀態
;因為忍受度最多不超過7個
,所以在
i點後面第
8個人是肯定不能先打飯的
,所以狀態只要儲存 8個人
;那麼設
dp[i][s][k]表示i
之前(1~i-1)
的所有人已經打完飯
,i以及
i往後七個人中的狀態為
s,k表示目前為止最後乙個打飯的人離
i的相對位置
,(k=p-i);
考慮轉移:如果i
這個人打了飯
,那麼狀態就可以轉移到
dp(i+1,s>>1,k-1) ,s>>1:
第i+8
個人肯定沒有打飯
,所以狀態
7號位為
0,0號位為原來的1號位
......;k-1 :
上乙個打飯的是
p,p-i=k,
所以到i+1
時就便成了
p-(i+1)=k-1;
如果i這個人沒有打飯
,那麼就列舉
[i,i+7]
沒打飯的人
,設讓第
i+l位打飯
(0<=l<=7) ,
則狀態轉移到
dp(i,s|(1<
這個題想還是很難想的,
觀察資料範圍
,定義正確的狀態很重要
;
1 #include2 #include3 #include4 #include5 #include6 #include7 #include"set"
8 #include"
queue
"9 #include"
vector
"10 #include"
iomanip
"11 #include"
cstring"12
#define inf 1<<29
13#define ll long long
14#define re register
15#define il inline
16#define rep(i,a,b) for(register int i=a;i<=b;++i)
17#define file(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
18#define f(i,j,k) dp[i][j][k+8]
19using
namespace
std;
20int dp[1002][1
<<8][17
];21
int t[1002],b[1002
],n;
22int w[10
];23 inline int
gi()
30 il int cal(int i,int
j) 34
intmain()60}
61}62 re int ans=inf;
63for(re int k=-8;k<=0;++k)
64 ans=min(ans,f(n+1,0
,k));
65 cout67return0;
68 }
BZOJ1226 SDOI2009 學校食堂
題目點這裡 由題目可知,假如第i個人還沒有取,則絕不可能取i 7之後的人,因為第i個人的最大容忍度不會超過7 如果第i個人之前全部取完了,則目前為止最後乙個選的不可能是i 8之前的人,因為i 1不可能先於i 9及之前的人被選。故,可以設計狀態f i,s,k 表示到第i個人為止,他之前的人都取過了,他...
Codevs 1586 學校食堂
1586 學校食堂 時間限制 1 s 空間限制 256000 kb 題目等級 大師 master 題目描述 description 小f的學校在城市的乙個偏僻角落,所有學生都只好在學校吃飯。學校有乙個食堂,雖然簡陋,但食堂大廚總能做出讓同學們滿意的菜餚。當然,不同的人口味也不一定相同,但每個人的口味...
SDOI2009 學校食堂
time limits 1000 ms memory limits 262144 kb detailed limits description 小f 的學校在城市的乙個偏僻角落,所有學生都只好在學校吃飯。學校有乙個食堂,雖然簡陋,但食堂大廚總能做出讓同學們滿意的菜餚。當然,不同的人口味也不一定相同,...