洛谷 P1315 观光公交(贪心+模拟)

题目链接: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 }
AC代码

 

posted @ 2020-08-06 07:12  dfydn  阅读(127)  评论(0编辑  收藏  举报