【Codeforces Round #185 (Div. 2) D】Cats Transport
【鏈接】 鏈接
【題意】
有n座山,m只貓。
每只貓都在其中的一些山上玩。
第i只貓?jiān)趆[i]山上玩,且會在t[i]時刻出現(xiàn)在山腳下(然后就一直在那里等)
然后有p個人。
它們聽從你的安排。
在某個時刻從1號山出發(fā),依次經(jīng)過每座山,如果有貓?jiān)谏侥_。那么它會順便把它們帶走。
(山與山之間有距離,然后人移動的速度是1單位每秒)
每個人可以無限數(shù)量地拿貓。
問你所有貓的總等待時間的最小值是多少。
(人可以在負(fù)數(shù)的時間出發(fā))
【題解】
把山與山之間的距離求成前綴和。
即d[i]表示1..i之間的距離
然后對于第i只貓,設(shè)a[i] = t[i] - d[h[i]];
則a[i]就表示恰好走到h[i]的時候,貓恰好下來,應(yīng)該從何時從1出發(fā)。
按照a[i]升序排一下。
那么
現(xiàn)在相當(dāng)于,讓你在這m只貓里,選連續(xù)的p個段。分完所有的m只貓。
且所有貓的等待時間總和最短。
這個可以用區(qū)間DP來寫。
每個區(qū)間里的貓都在區(qū)間的右端點(diǎn)的貓的時間出發(fā)去取。然后算一下代價就好。
設(shè)s[i] = a[1] + a[2] +...+a[i],dp[i][j]表示i個人管了前j只貓的最小值
則dp[i][j] = min{dp[i-1][x] + a[j](j-x)-(s[j]-s[x])};
這樣的復(fù)雜度是
\(O(p*m^2)\)
考慮斜率優(yōu)化。
假設(shè)x<y<j
且y優(yōu)于x
即
dp[i-1][y] + a[j]j - a[j]y-s[j]+s[y] < dp[i-1][x] + a[j]j - a[j]x-s[j]+s[x]
即
dp[i-1][y]+s[y]-a[j]y<dp[i-1][x]+s[x]-a[j]*x
也即
\(\frac{dp[i-1][y]+s[y]-(dp[i-1][x]+s[x])}{y-x} < a[j]\)
而a[j]我們已經(jīng)升序排了,是單調(diào)遞增的。
那么就是一個經(jīng)典的斜率優(yōu)化了。
優(yōu)化過后。
復(fù)雜度能降為\(O(p*m)\)級別。
【錯的次數(shù)】
在這里輸入錯的次數(shù)
【反思】
在這里輸入反思
【代碼】
#include<bits/stdc++.h> #define ll long long using namespace std;const int N = 1e5; const int P = 1e2;int n,m,p,d[N+10],a[N+10]; ll s[N+10]; ll dp[P+10][N+10]; int dl[N+10],head,tail;double ju(int i,int x,int y) {return (1.0)*(dp[i-1][y] + s[y] - (dp[i-1][x]+s[x]))/(1.0*(y-x)); }int main() {//freopen("F:\\rush.txt","r",stdin);scanf("%d%d%d",&n,&m,&p);for (int i = 2;i <= n;i++){scanf("%d",&d[i]);d[i]+=d[i-1];}for (int i = 1;i <= m;i++){int h,t;scanf("%d%d",&h,&t);a[i] = t - d[h];}sort(a+1,a+1+m);for (int i = 1;i <= m;i++)s[i] = s[i-1] + a[i];for (int i = 0;i <= p;i++)for (int j = 1;j <= m;j++)dp[i][j] = 1e17;dp[0][0] = 0;for (int i = 1;i <= p;i++){head = 1,tail = 1;dl[1] = 0;for (int j = 1;j <= m;j++){while (head < tail && ju(i,dl[head],dl[head+1])<a[j]) head++;dp[i][j] = min(dp[i][j],dp[i-1][dl[head]] + 1LL*a[j]*(j-dl[head])-(s[j]-s[dl[head]]));while (head < tail && ju(i,dl[tail-1],dl[tail])>ju(i,dl[tail],j)) tail--;dl[++tail] = j;}}printf("%lld\n",dp[p][m]);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/AWCXV/p/7636636.html
總結(jié)
以上是生活随笔為你收集整理的【Codeforces Round #185 (Div. 2) D】Cats Transport的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个完整的增删改查模块(以我们的项目‘危
- 下一篇: 首份财报营收增长扭亏为盈,为何怪兽充电的