题目大意
有n个排成一列的公交站,两个站之间要花费一定时间,有一些乘客某个时间从某个站到另一个站,车要等齐人才能开车,我们有k次机会减少两个站的时间,求旅客花的时间最少是多少。
解题思路
计算每个站到达的时间,计算能影响到多少人,贪心地使用每一次机会。
code
using namespace std;
int const maxn=1000;
int n,m,k,d[maxn+10],dep[maxn+10],arr[maxn+10],far[maxn+10],cnt[maxn+10],cnt2[maxn+10];
int main(){
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
fo(i,2,n)scanf("%d",&d[i]);
int ans=0;
fo(i,1,m){
int t,a,b;scanf("%d%d%d",&t,&a,&b);ans-=t;
dep[a]=max(dep[a],t);cnt[b]++;
}
fo(i,1,n)cnt[i]+=cnt[i-1];
for(;k;){
fo(i,2,n)arr[i]=max(arr[i-1],dep[i-1])+d[i];
far[n]=n;int mx=-1,pos;
fd(i,n,2){
if((mx<cnt[far[i]]-cnt[i-1])&&(d[i]>0)){
mx=cnt[far[i]]-cnt[i-1];
pos=i;
}
if(arr[i-1]<=dep[i-1])far[i-1]=i-1;
else far[i-1]=far[i];
}
if(mx==-1)break;
d[pos]--;
k--;
}
fo(i,2,n)printf("%d\n",d[i]);
fo(i,2,n)arr[i]=max(arr[i-1],dep[i-1])+d[i];
fo(i,2,n)ans+=arr[i]*(cnt[i]-cnt[i-1]);
printf("%d",ans);
return 0;
}