Luogu2157 SDOI2009 學校食堂

2022-02-02 06:52:27 字數 1158 閱讀 1496

link

給定 \(n\) 個學生的口味和忍耐度,若前一道菜的對應的口味是a,這一道為b,則做這道菜所需的時間為 \((a| b)-(a\&b)\),而做第一道菜是不需要計算時間的.

每個學生可以忍耐忍耐度以下的人在他前面插隊買飯

求最小的做飯時間

\(n\le 1000,b_i\le 8\)

令 \(f_\) 表示第 \(i\) 個人前面的狀態是 \(s\) 的最小花費

令 \(f_\) 表示第 \(i\) 個人後面的狀態為 \(s\)

其實狀態有點等效,從前還是從後轉移而已……

但是都不會轉移……所以去抄題解……

設 \(f_\) 為第 \(1\) 到 \(i-1\) 個人已經打完飯,然後第 \(i\) 個人和後面的 \(7\) 個人的打完飯與否的狀態為 \(j\) ,當前打完飯的最後乙個人是 \(k+i\) 的最小時間

不能轉移的都設定成 \(inf\)

分類討論轉移

\(1.\) 不符合狀態的定義

無意義的狀態要避免迴圈,就是 \(f_=inf\)

\(2.\) 轉移狀態

\((1)\) 在 \(st\&1==1\) 時

\[f_=min(f_,f_)

\](這倆狀態一致,所以直接轉移)

\((2)\)

第 \(i\) 個人吃飯,往下轉移(這裡要注意的是否滿足 \(j\&1==0\))

第 \(i\) 個人後面的第幾個人吃飯,這裡還得判斷是不是讓人憤怒了,這裡做個最大可行位置就成的了

判斷是不是第乙個吃飯的時候直接考慮 \(i+k==0\) 就好

#includeusing namespace std;

#define int long long

namespace yspm

const int n=1010;

const int inf=0x3f3f3f3f3f3f3f3f;

int n,b[n],t[n],f[n][256][17];

inline int id(int x)

inline void work()

int rpos=n;

for(int l=0;l<=b[i]&&i+l<=rpos;++l)

{if(j&(1《大概學到了這種加一維控制轉移的題目

其實這題目和「奇怪的道路」確實很類似

P2157 SDOI2009 學校食堂

傳送門 做菜主要是按時間順序,所以可以考慮dp 但是可能後面的人會先打飯 可以發現同學最多只能讓後面的第7個同學先打飯 可以從這裡入手考慮問題 把每8個一起的同學看成乙個狀態 在他們之前的人都已經打好飯了 想象乙個從左往右的佇列 從1 i 1 的同學都打完飯了 然後需要知道的狀態是 i i 7 共8...

P2157 SDOI2009 學校食堂

小f 的學校在城市的乙個偏僻角落,所有學生都只好在學校吃飯。學校有乙個食堂,雖然簡陋,但食堂大廚總能做出讓同學們滿意的菜餚。當然,不同的人口味也不一定相同,但每個人的口味都可以用乙個非負整數表示。由於人手不夠,食堂每次只能為乙個人做菜。做每道菜所需的時間是和前一道菜有關的,若前一道菜的對應的口味是a...

luogu3706 SDOI2017 硬幣遊戲

link 硬幣遊戲 對於100分 我們不難想到這個矩陣過大 且沒有用的節點很多我們最後只要n個節點的答案 其他節點的答案可以不要。考慮把沒用的節點的答案壓到一點上。相同的套路 我們設f i 表示經過第i個點的期望次數 由於是到達某個點我們強制停止 所以概率 結果 期望次數。此時結果為1 0 所以這個...