题目链接:https://www.luogu.com.cn/problem/P1315
设$p_i$为车到达时间,$c_i$为有多少人终点在i,$t_i$为出发时间,那么$ans= sum p_i*c_i- sum t_i$,让它最小。
这道题注意用了一个氮气,它所造成的影响是后面的一个区间,是在这个区间内下车的人,直到被last卡到。
AC代码:

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int N=10005; 8 int n,m,k,ans,T; 9 int maxn,pos; 10 int d[N]; 11 struct node{ 12 int end,off,arr,ti,st,last; 13 }q[N]; 14 int main(){ 15 scanf("%d%d%d",&n,&m,&k); 16 for(int i=1;i<n;i++) scanf("%d",&d[i]); 17 for(int i=1;i<=m;i++){ 18 scanf("%d%d%d",&q[i].ti,&q[i].st,&q[i].end); 19 q[q[i].st].last=max(q[q[i].st].last,q[i].ti); 20 q[q[i].end].off++; 21 } 22 for(int i=1;i<=n;i++){ 23 q[i].arr=T; 24 T=max(T,q[i].last); 25 T+=d[i]; 26 } 27 while(k--){ 28 maxn=0; 29 for(int i=2;i<=n;i++){ 30 if(!d[i-1]) continue; 31 int t=0; 32 for(int j=i;j<=n;j++){ 33 t+=q[j].off; 34 if(q[j].arr<=q[j].last) break; 35 } 36 if(t>maxn) maxn=t,pos=i; 37 } 38 d[pos-1]--; 39 for(int i=pos;i<=n;i++){ 40 q[i].arr--; 41 if(q[i].arr<q[i].last) break; 42 } 43 } 44 for(int i=1;i<=m;i++) ans+=q[q[i].end].arr-q[i].ti; 45 printf("%d",ans); 46 return 0; 47 }