題目:
分析:設last[i]表示來到第i個景點的乘客最晚的時間,time[i]表示車到達第i個景點的最小時間。
因為每個乘客到達的時間已經固定,所以要使總時間最小,就是使σtime[down[i]]最小,其中down[i]代表每位乘客的目的地。
先考慮不用加速器的情況。可以直接遞推求出答案,time[i] = max(time[i - 1],last[i - 1]) + d[i - 1];
接下來再來考慮使用加速器減少的時間。對於每個加速器,我們必須使這個加速器獲得最大的效益,即使盡可能多的乘客旅行時間減一。如果我們在i到i + 1間使用加速器的話,那麼到i + 1站的乘客的旅行時間都會減一,但是如果time[i + 1]小於last[i + 1]的話,車就要在i + 1站等到last[i + 1]所有的乘客上車,在i + 1站以後下車的乘客的時間是一樣的,也就是說這個加速器對後面下車的乘客沒有影響。我們可以用遞推求出每個i最遠能影響的車站。
g[i] = g[i + 1] (time[i + 1] > t[i + 1])
g[i] = i + 1 (time[i + 1] <= t[i + 1])
那麼,我們用乙個加速器所能減少乙個單位時間的乘客就是sum[g[i]] - sum[i],每次找出使這個最大的i即可。然後把ans減掉,維護time,g.
**:
#include
#include
#include
using namespace std;
const int tmax=1005,tmax2=10005;
int n,m,k,g[tmax],time[tmax],last[tmax],ans,up[tmax2],down[tmax2],dist[tmax],sum[tmax];
void work()
if(p==0) break;
dist[p]--;
ans-=top;
}printf("%d",ans);
return;
}void init()
int main()
init();
work();
return
0;}
NOIP2011 觀光公交
傳送門 luogu 有點麻煩,幸好 o n 2 能過。貪心地想一想,我們如果要用加速器,肯定是要選擇車上人數最多的時段加速。但是我們就會面臨這樣的情況 那麼我們就分類討論一下,預處理一些東西 每個站的下車人數,需要更新的車到站時間,每個站的最後乙個下車人數。然後隨便搞一下就好了。include in...
NOIP2011 觀光公交
這是乙個貪心,說實話開始做的時候.完全沒看出來qaq。首先對於每個點當然是能走就走,不能走就等待,這是無法控制的。所以只考慮氮氣加速器加在 可以使時間總和盡量少。如果選擇加速,可能會使後面等待的時間更長,或者更短,對後面都會有影響。但是沿著一條邊加速會影響後面的所有邊麼?這可不一定 來來來,我們分類...
noip2011 公交觀光
風景迷人的小城y市,擁有n個美麗的景點。由於慕名而來的遊客越來越多,y市特意安排了一輛觀光公交車,為遊客提供更便捷的交通服務。觀光公交車在第0分鐘出現在1號景點,隨後依次前往2 3 4 n號景點。從第i號景點開到第i 1號景點需要di分鐘。任意時刻,公交車只能往前開,或在景點處等待。設共有m個遊客,...