NOIP 2011 Day2 Problem3 (调试中)

来源:互联网 发布:5230手机加密软件 编辑:程序博客网 时间:2024/06/14 22:10
#include<cstdio>#define MAXN 1010#define max(a,b) (a>b?a:b)int arrive[MAXN],last[MAXN],dis[MAXN],range[MAXN],num[MAXN];int main(){int m,n,k,sum=0;freopen("bus.in","r",stdin);freopen("bus.out","w",stdout);scanf("%d %d %d",&n,&m,&k);for(int i=1;i<n;i++)scanf("%d",&dis[i]);for(int i=1;i<=m;i++){int start,end,t;scanf("%d %d %d",&t,&start,&end);num[end]++;sum-=t;if(t>last[start])last[start]=t;}for(int i=1;i<=n;i++)num[i]+=num[i-1];for(int i=1;i<=k;i++){int ra=n;for(int i=2;i<=n;i++)arrive[i]=max(arrive[i-1],last[i-1])+dis[i-1];for(int i=n;i>=1;i--){if(arrive[i]<last[i])ra=i;range[i]=max(i,ra);}int max=0,max1=0;for(int i=1;i<=n;i++){if(dis[i]!=0 && num[range[i]] - num[i-1] > max){max1=i;max=num[range[i]] - num[i-1];}}dis[max1]--;}for(int i=2;i<=n;i++)arrive[i]=max(arrive[i-1],last[i-1])+dis[i-1];for(int i=2;i<=n;i++)sum+=arrive[i] * (num[i]-num[i-1]);printf("%d",sum);return 0;}