洛谷 P6775 製作菜品

2022-03-12 12:19:39 字數 2770 閱讀 5018

第 100 篇部落格祭!upd 2020.9.8:發現不是的,這是第 101 篇,之前寫的 cf 809d 題解忘了分類了)

話說這題為啥是個黑題啊,感覺我能獨立 ac 的題都不能算黑題(

然而在考場上還寫掛了,有調味料選了 \(0\mathrm g\),而輸出格式規定 \(y>0\)(悲)。這啟示我們下次寫 spj 題的時候,如果自己寫 checker 判正確性,一定要把題麵裡所有的限制都判一下……

題意見洛谷。

首先,顯然有 \(\sum d_i=mk\)。以下設 \(mn=\min\,mx=\max\\),則 \(mx\geq \dfrac mnk,mn\leq \dfrac mnk\)。

注意到奇奇怪怪的資料範圍,不妨先從 \(m=n\) 入手。此時顯然有 \(mx\geq k,mn\leq k\)。考慮配出一道菜,那麼可以優先將 \(mn\) 用掉,然後用 \(mx\) 解決剩下的 \(k-mn\),由於 \(mn\geq1\),所以一定有 \(mx>k-mn\),\(mx\) 用不完。可以保證恰好用掉乙個原料。此時 \(n,m\) 都減一,轉化為了乙個規模小一級的 \(m=n\) 問題。邊界是 \(n=m=0\)。

然後考慮 \(m>n\)。顯然有 \(mx>k\)。直接用 \(mx\) 配出乙個菜,還用不完,只有 \(m\) 減一。就這樣一直減減減,直到 \(m=n\) 為止。

然後考慮 \(m=n-1\)。\(m=1,n=2\) 時直接配就可以了(這是邊界)。否則,考慮配出一道菜。那麼能否配出一道菜呢?這就要滿足 \(mx+mx'\geq k\),其中 \(mx'\) 表示第二大的原料。肉眼只能得到 \(mx\geq \dfracnk\) 這樣乙個條件,彷彿不能保證一定能配出。但是經過不懈的嘗試,還是證出來了一定能。

證明:反證法。假設不能,則 \(mx+mx',即 \(mx'。又 \(\sum d_i\leq (n-1)mx'+mx=u\),顯然當 \(mx=\dfracnk\) 時,\(u\) 的上限最鬆為 \(u<(n-1)\left(k-\dfracnk\right)+\dfracnk=\dfracnk\)。所以 \(\sum d_i<\dfracnk\)。又 \(n>2\),所以 \(\dfrac2n<1\),所以 \(\dfracnk<(n-1)k=\sum d_i\),矛盾。得證。

所以只需要優先用 \(mx'\),再用 \(mx\)。但是就怕 \(mx'>k\),用不完,那麼用掉之後就 \(m=n-2\) 了,哦吼,未知問題。那怎麼辦呢?注意到顯然有 \(mn,先把 \(mn\) 用掉即可。這樣可能會轉化到乙個規模小一級的 \(m=n-1\),也有可能 \(m=n\)(可能會 \(mx+mx'=k\))。

至此,\(m\geq n-1\) 就歸納做完了。\(m=n-2\) 貌似沒有啥思路?注意到可以將原料和菜分成兩部分,使得每部分內部的原料和菜質量相等,並且 \(m_1=n_1-1,m_2=n_2-1\),這樣就可以做了。然後猜想,若不能分,則無解,並試圖證明。然後就證出來了(我考場上沒證,直接寫的)。

證明:考慮證明逆否命題:若有解,則能分。考慮將每個菜看作節點,將每個原料也看作節點,若乙個菜用了乙個原料,則它們之間有邊,構成一張二分圖。顯然,有 \(n+m\) 個點,最多有 \(2m\) 條邊。要想圖連通,必要條件是 \(2m\geq n+m-1\),即 \(m\geq n-1\)。現在 \(m=n-2\) 則圖一定不連通。然後顯然一定存在連通分量的 \(m'=n'-1\),因為全是 \(m'\geq n'\) 的話最終就 \(m\geq n\) 了。所以這個連通分量以及它的補圖是獨立的,各自有解。得證。

接下來就是怎麼分的事了。設分成兩個集合 \(s,t\),則對 \(a=s\) 或 \(a=t\) 都有 \(\sum\limits_(d_i-k)=-k\)。這是乙個很簡單的 01 揹包,最終還原一下路徑即可。定義域是 \(\mathrm o(nk)\) 的,要更新 \(n\) 遍,複雜度 \(\mathrm o\!\left(n^2k\right)\),吃不消。注意到 dp 陣列只記錄能否湊出的布林值,轉移時bitset移位 + 按位或即可。

總時間複雜度 \(\mathrm o\!\left(\dfracw\right)\)。

**(好像要加個 o3,然後過不過還要看評測只因心情。不過 ccf 只因應該更快吧,當時我查分的時候發現全是 pe 沒有 t 的):

#pragma gcc optimize(3)

#includeusing namespace std;

#define pb push_back

#define mp make_pair

#define x first

#define y second

const int inf=0x3f3f3f3f;

const int n=500,k=5000;

int n,m,k;

int d[n+1];

vector,pair> > ans;

void use(int x,int y=0)

else

}void m_lss_n()

if(mx2.x>k)use(mn.y,mx2.y);

else use(mx2.y,mx1.y);

}void m_eq_n()

void m_grt_n()

void deal()

memset(d,0,sizeof(d));

for(int i=0;i>testnum;

while(testnum--)mian();

return 0;

}

洛谷P1169 棋盤製作

懸線法 好像 是可以解決給定矩陣中滿足條件的最大子矩陣的樣子 先就提論題 設 f i j 為從 i,j 點擴充套件最多能達到的最左端的點 color 設l i j 為從 i,j 點擴充套件能達到的最右端的點 color 設up i j 為從 i,j 點能擴充套件到的上界 然後就是 color 從左往...

洛谷P1094 紀念品分組

元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據 進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的 之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。你的任務是寫乙個程式...

洛谷 P1094 紀念品分類

剛開始看到這題就確定這題最好先要排序 第乙個想法是排好序後先讓第乙個和從倒數第乙個開始相加和如果就 w,那麼用n除以2或者再加一得出答案,然後發現隨便 當w 110 n 5序列為 10 50 60 90 100便不成立,遂將其捨棄。第二個想法 依舊是從前面和倒數往前的相加,如果大於w,那麼就代表這個...