AcWing 303 運輸小貓

2022-09-18 23:06:11 字數 3010 閱讀 5955

題目傳送門

1、乙個飼養員從某個時刻出發,能夠接走哪些貓

換句話說:要滿足什麼條件的貓才能夠被該飼養員接走? 顯然,只需要到達某只貓所在山的時候,並且這只貓已經玩完了就可以接走貓了。

2、用數學語言進行描述問題

設乙個飼養員出發的時間是\(st\),某只貓(具體是哪乙隻不重要,重要的是整體的等待時間)在第\(i\)座山上玩,並且要玩\(t_i\)時間,該飼養員能夠接走該貓只需要出發時間加上趕路時間大於等於貓玩耍的結束時間即可,即\(st + sd_i >= t_i\)時可以接走貓,否則小貓沒有玩完,就不想走,你也接不走。

不好理解的話,也舉栗子:小貓要玩\(3\)個小時,飼養員走到這座山需要\(2\)個小時,那麼飼養員需要在\(1\)這個時間點出發(也就是飼養員在起點休息\(1\)小時後出發去接),就正好走到這座山時,小貓正好玩完,可以馬上接走,等待時間為\(0\)。當然,飼養員也可以一點出發,這樣,小貓就需要等一會才能被接走。這個關係需要思考一下,很容易搞反了。

注意:\(sd_i=sum(d_1,d_2,...d_i)\),因為\(d_i\)是指山與山之間的距離,我們現在要計算總距離,就是從起點到\(i\)的距離,當然是使用字首和了。

\(sd_i\)和\(t_i\)都是固定的,而飼養員的出發時間是可以變化的,故\(st\)時刻出發,可以接走剩下貓中的\(t_i - sd_i <=st\)的貓。因此需要按照所有貓的玩耍結束時間減去山的距離自小到大排序,方便確定飼養員能夠接走哪些貓

3、動態規劃

狀態表示

為什麼這麼定義?因為我們需要答案,需要在狀態定義中包含每乙個分步的答案,以及最終的答案

為什麼是二維的?因為只使用一維無法描述情況。換句話說:能使用一維不使用二維,有了限制條件,才不得不增加維度。

狀態轉移:\(f[i][j] = min(f[i-1][k] + a_j*(j-k)-(s_j-s_k))\)

其中\(a_j\)是第\(j\)只貓的玩完時間(\(t_i\))減去山的距離(\(d_i\))。

狀態轉移方程是怎麼來的呢?

舉個栗子來模擬:

我們已經對小貓的玩耍時間-距離起點的距離從小到大排序\(a_1,a_2,…,a_m\)

由此可知需要對\(a\)進行取一下字首和,這樣才方便計算出某個區間內的元素和。

按上面的栗子來理解:\(j=5,k=2\),抽象出下面的式子:

\(a_j*(j-k)-(a_ + a_ + ...+a_j) = a_j*(j-k)-(s_j-s_k)\),其中\(s\)表示\(a\)陣列的字首和。

\(k\)的取值可以從\(0\)到\(j-1\),當然\(k\)取到\(j\)也是沒問題的,表示第\(i\)個人乙隻貓都沒接到,都被前\(i-1\)個飼養員接走了,但是顯然多乙個人去接的可以減少貓的等待時間,所以\(f[i-1][j]\)不可能是\(f[i][j]\)的最優解,或者說最多與最優解相等,因此也就不用考慮\(k = j\)的情況了。

設\(k^\)是使得\(f[i][j]\)取得最小值的那個\(k\),所以:\(f[i][j] = f[i-1][k^] + a[j]*(j-k^)-(s[j]-s[k^])\)

4、斜率優化

求\(f[i][j]\)時\(i\)和\(j\)相關的變數都是已知的(通過列舉來嘗試嘛,當然是已知的啦),變形得到\(f[i-1][k^] + s[k^] = a[j] * k^ + f[i][j] - a[j]*j + s[j]\),其中\(a[j],j,s[j]\)都是已知的,將\(f[i-1][k^] + s[k^]\)看作\(y\),\(k^\)看作\(x\),就得到了乙個一次函式,要使\(f[i][j]\)最小即使得截距最小,就可以使用斜率優化了,

具體斜率優化的推導可以參考\(acwing 301\) 任務安排2,寫習慣後就可以直接分析這個式子的性質:

隨著\(j\)的增加,新加入點集中的點\((k,f[i-1][k] + s[k])\)也是遞增的,並且斜率\(a_j\)也是遞增的,因為之前已經對\(a\)陣列排序了。所以後面的就可以完全仿照任務安排那題了,維護乙個斜率自隊頭向隊尾遞增的單調佇列

遍歷到\(j\)時,查詢使\(f[i][j]\)取得最小值的\(k\),查詢到比當前斜率\(a_j\)小的斜率都出隊,查詢到第乙個大於\(a_j\)的斜率就找到了\(k\)。

出隊尾時,也是要保證新加入隊尾的斜率要嚴格的大於之前隊尾的斜率,否則就要出隊尾。

至於如何求隊頭隊尾的斜率,就相當簡單了,\((k,f[i-1][k] + s[k])\)是點座標的形式,隊頭的斜率等於\(k\)取\(q[hh]\)以及\(q[hh+1]\)這兩點構成的斜率,隊尾的斜率等於\(k\)取\(q[tt]\)和\(q[tt-1]\)這兩點構成的斜率,(斜率表示式較長,這裡就不寫了,具體表示式見**即可)。

#include using namespace std;

const int inf = 0x3f3f3f3f;

const int n = 100005;

typedef long long ll;

int n, m, p, q[n];

ll d[n], t[n], a[n], s[n], f[105][n];

int h;

int main()

}printf("%lld\n", f[p][m]);

return 0;

}

AcWing 小貓爬山

翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,翰翰和達...

Acwing 165 小貓爬山

翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn.當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,翰翰和達...

acwing165 小貓爬山

做題心得acwing165.小貓爬山 題目翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重...