P5017 擺渡車 題解

2022-05-16 15:59:46 字數 1218 閱讀 4816

p5017 擺渡車

這道題的做法很多,我考慮用斜率優化的方法來做

先定義\(f[i]\)表示運走\(i\)時間之前的人,並且必須在\(i\)這個時間發車的最小代價

。很顯然\(f[i]=min(f[j]+\sum_^i(i-t_k))\)

我們考慮用乙個類似字首和的東西預處理出\(\sum_^i(i-t_k)\)

用\(g[i]\)記錄\(i\)時間前有幾個人,用\(s[i]\)記錄\(i\)時間前的人的\(t_i\)和

於是\(\sum_^i(i-t_k)=(g[i]-g[j]) \ast i-(s[i]-s[j])\)

這裡要注意\((j+1)+m<=i\)

於是推一下式子

\[f[i]=f[j]+\sum_^i(i-t_k)

\]\[f[i]=f[j]+(g[i]-g[j]) \ast i-(s[i]-s[j])

\]\[i \ast g[j] +f[i]+s[i]+i \ast g[i]=f[j]+s[j]

\]這裡\(k=i\),\(x=g[j]\),\(b=f[i]+s[i]+i \ast g[i]\),\(y=f[j]+s[j]\)

然後發現是有決策單調性的,於是用單調佇列優化就好了。

要注意,要先對\(f[i](0≤i<m)\)預處理,\(f[i]=g[i]\ast i-s[i]\),就是前面的人都要上車

#includeusing namespace std;

const int maxn=4e6+105,inf=1<<30;

int n,m,max_t,g[maxn],s[maxn],f[maxn],hed=1,til=0,q[maxn],ans=inf;

inline int read()

while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();

return ret*f;

}inline int x(int j)

inline int y(int j)

inline long double calc(int i,int j)

int main()

for(int i=1;i=calc(q[til-1],i-m+1))--til;

q[++til]=i-m+1;

} for(int i=max_t;iprintf("%d\n",ans);

return 0;

}

洛谷P5017擺渡車

題目 一道做法多種多樣的題,dp做法的狀態也很多。我用 dp i 表示在第i秒發車的時間和,然後dp方程就很好寫了 dp i dp j i車的等待時間 j屬於i 2m i m。然後i車的等待時間可以用字首和來優化求出,雖然很慢,但是足以通過這道題了。include include include i...

NOIP2018 普及組 擺渡車 題解

關於我上冬令營網課時,聽說普及組考過斜率優化dp這件事 擺渡車往返一次要 m 分鐘,但擺渡車可以在起點等人,故可以將往返一次的時間 t in m,infty 但是個人都不會讓他等於正無窮吧?求這 n 個人等待時間之和最小值。首先,觀察資料範圍 小資料就不說了吧 顯然,可以根據時間設定狀態。設 f 表...

題解 P1011 車站

posted on 2019 08 20 22 07 29 蒟蒻的第一篇題解 教你怎樣打表 這一道題目其實是個數學題,也不是很難,我們可以先在草稿紙上寫一下 用 x,y 代表a和b的係數12 3456 上車u 1,0 0,1 1,1 1,2 2,3 3,5 下車d 0,0 0,1 0,1 1,1 1...