luogu P1315 观光公交 贪心
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 typedef long long ll; 5 const int MAXN = 1050; 6 struct node 7 { 8 int arr,st,ed; 9 } id[MAXN * 10]; 10 int t[MAXN];//最晚时间 11 int ti[MAXN];//到达时间 12 int sum[MAXN];//人数 13 int dis[MAXN]; 14 int g[MAXN]; 15 int n,m,k; 16 int main() 17 { 18 scanf("%d%d%d",&n,&m,&k); 19 for(int i = 1;i <= n - 1;i++) 20 scanf("%d",&dis[i]); 21 for(int i = 1;i <= m;i++) 22 { 23 scanf("%d%d%d",&id[i].arr,&id[i].st,&id[i].ed); 24 t[id[i].st] = max(t[id[i].st],id[i].arr);//到大某点的最晚时间 25 sum[id[i].ed]++;//到达某点的人数 26 } 27 for(int i = 2;i <= n;i++) 28 sum[i] += sum[i - 1]; 29 for(int i = 1;i <= n;i++) 30 ti[i] = max(ti[i - 1],t[i - 1]) + dis[i - 1]; 31 int ans = 0; 32 for(int i = 1;i <= m;i++) 33 ans += ti[id[i].ed] - id[i].arr; 34 while(k) 35 { 36 g[n - 1]=n; 37 for(int i = n - 2;i > 0;i--) 38 { 39 if(ti[i + 1] > t[i + 1]) 40 g[i] = g[i + 1]; 41 else 42 g[i] = i + 1; 43 } 44 int pos = 0,ma = 0; 45 for(int i = 1;i < n;i++) 46 { 47 if(dis[i] && (sum[g[i]] - sum[i]) > ma) 48 { 49 ma = sum[g[i]] - sum[i]; 50 pos = i; 51 } 52 } 53 if(!ma) 54 break; 55 k--; 56 dis[pos]--; 57 ans -= ma; 58 for(int i = 1;i <= n;i++) 59 ti[i] = max(ti[i - 1],t[i - 1]) + dis[i - 1]; 60 } 61 printf("%d\n",ans); 62 63 return 0; 64 }
心之所动 且就随缘去吧