題目要求求出 ,然後在找出序列 中差距最小的元素即可。
用 next_permutation
枚舉每一種排列方式即可,複雜度
用依序加入元素的方式來製造排列 , 為目前總和也就是 。每次加入 時,若 加入後最終答案只會更差,因此只考慮 使 ;接著選擇符合的 中最小的,答案不會更差。
因此,紀錄一個 代表目前已選擇元素的總和,每次遍歷所有元素。從尚未挑選過的元素且大於 中選擇最小的,並加入 。直到不存在任何一個元素大於 ,剩下未被挑選的元素任意排列即可。時間 。
"每次遍歷所有元素。從尚未挑選過的元素且大於 中選擇最小的" 可以以 set
在 實現。時間 。
可以以 枚舉每個餅乾要不要補上麵團。
只有兩種可能, 或 。若 為 則補上麵團,則每個手指餅乾都會是 。
以 可以枚舉一個數字的所有因數。枚舉 和 的所有因數,對 檢查補上麵團或不補上麵團否至少一個被該因數整除。
時間 。
可以從 Subtask 2 獲得啟發,只要把每個數字補成偶數即可。用 Subtask 3&4 的作法,枚舉到的第一個因數就會是 ,也可通過此子題 OwO。
若 就全部不要連,否則每個人都跟對面的人連,答案即為
也就是第一排的人跟第二排的哪個人連都沒有區別。因此第一排的人都優先考慮連自己正對面的人,若 則第 人不參與配對即可。
暴力枚舉第一排的人要跟第二排的哪個人配對,複雜度 。
考慮動態規劃, 代表第一排的 和第二排 參與配對。
轉移情況有三種:
因此轉移為 。
首先必須觀察出,擴大水桶的步驟全部做完再把水倒入鍋釜,是比較好的。
因此先從 到 枚舉需要消耗多少魔力擴大多少次水桶,每次再算出需要消耗多少體力倒入鍋釜,取相加最小值,複雜度 。
擴大 次水桶後的水桶容量,即為 ,將 用 公式計算可以優化到 。
當擴大水桶後的容量至少為 ,只要消耗一體力倒入鍋釜。因此只要枚舉擴大次數 直到 即可,由上面的公式可以得知枚舉不超過 次。複雜度
為擴大 次的總體力+魔力消耗,,,因此當 時 會 ,因此答案出現在
另一個不嚴謹的證明是,把 當成 做算幾,當 時有最小值。
無論怎麼配都不會損失美味程度,所以把每個調味料配給跟他絕配的麵當中,美味程度最高的就好了。
複雜度。
因為很小,暴力去試每一種組合,再取美味程度最大的組合。
複雜度。
我們可以把題目轉換成二分圖最大權匹配,直接套km。
對於地獄組合的負邊權,只要把他們都加上一個數,使得他們的邊權都變成正的,然後輸出的時候記得再減掉就可以了。
複雜度。
跟subtask1一樣,先把每個調味料配給跟他絕配的麵當中,美味程度最高的配給他。
而對於剩下沒被配到的麵,可以分成兩種case :
剩下的麵當中,都不和同一個調味料產生地獄組合。
這時候一定找的到一種配法,使得剩下的麵都不會配到會跟自己產生地獄組合 的調味料,所以直接輸出跟subtask1作法一樣的答案就好了。
剩下的麵當中,都會和同一個調味料產生地獄組合。
一個最直觀的想法就是把損失最少美味程度的麵配給那個調味料。
但這不一定會是最大的美味程度,這時候把先前已經配對過的麵,拿來配那個調味料,如果拿來配對的麵不會跟調味料產生地獄組合,就可以使損失的美味程度變成0,美味程度總和可能會更大。
所以就枚舉把每個先前已經被配到的麵配給那個調味料,並且把配那個麵的調味料中,美味程度次高的麵配給他,然後再取max。
複雜度。
枚舉兩個人都使用砲台,兩個人都不使用砲台,其中一個人使用砲台的情況。
複雜度。
使用最短路。
把每個座標跟及連一個邊權為1的邊,每個砲台跟降落點連一個邊權為0的邊。
做完最短路再去枚舉每個點兩人的最短路,並且取min。
複雜度。
因為太大,所以沒辦法使用,最多只能用的做法。
參考subtask2的建圖方式,會發現邊權只有0和1,所以其實可以用01bfs去做。
01bfs跟一般bfs不一樣之處在於一般bfs時保證讓queue當中的點,距離從前到後為非嚴格遞增。
但如果有邊權為0的邊,這時候從那條邊去更新其他點,並把它放進queue的最後方,可能會失去距離從前到後為非嚴格遞增這項性質。
這時候可以發現,最前面的點一定是在queue中距離最小者,而從邊權為0的邊所更新的點距離跟他一樣,是queue當中距離最小的,那只要把他塞進queue的頭就可以維護上述的性質了。
而c++有deque可以支援從頭或尾插入,所以把queue改成deque去做01bfs就可以了。
複雜度。
也是最短路,但因為太大,要改變建點跟建邊的方式。
我們可以將每個砲台所在的座標建成一個點,每個砲台的降落點座標也建成一個點。
把每個砲台跟他的降落點建一條邊權為0的邊,並把每個砲台跟他左右的兩個點建一條邊權為其距離的邊,之後去做最短路得出到每個點的距離。
再來去枚舉每兩個相鄰的點,算出如果在這兩個點的區間上見面所需的最少時間,然後再取min。
複雜度。
超小,而且他有給你測資,所以用手解。
可以發現,如果在及之間安裝一個傳送器,就會使目前在的朋友跟在的朋友位置交換。
而題目的要求是使得交換後朋友們的順序是按照由小排到大,這就很容易聯想到Bubble sort,這時候傳送器的數目就相當於時間複雜度。
Bubble sort的時間複雜度為,而題目的,並且傳送器數量最多可以到,所以用把朋友們依照做Bubble sort,並在每次交換時都標記成在兩者之間安裝一個傳送器就可以了。
或者你覺得最多只有1000太少了,用手解也是可以(X)。