这题主要思想就是贪心了。

每次找出最优加速点,更新时间,就可以了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int read(){
    int t=1,num=0;
    char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();}
    while(c>='0'&&c<='9'){num=num*10+c-'0';c=getchar();}
    return num*t;
}
const int mn=1010,mm=10010;
int n,m,k,a,b,t,ans=0;
int d[mn],last[mm]={0},arr[mn]={0},down[mn]={0},f[mn]={0};
int main()
{
    n=read();m=read();k=read();
    for(int i=1;i<n;i++)d[i]=read();
    for(int i=1;i<=m;i++){
        t=read();a=read();b=read();
        last[a]=max(last[a],t);
        down[b]++;ans-=t;
    }
    for(int i=1;i<=n;i++)arr[i]=max(last[i-1],arr[i-1])+d[i-1];
    while(k--){
        for(int i=n;i>=2;i--){
            if(!d[i-1])f[i-1]=0;
            else{f[i-1]=down[i];if(arr[i]>last[i])f[i-1]+=f[i];}
        }
        int zui=0,wz=0;
        for(int i=1;i<n;i++)if(f[i]>zui)zui=f[i],wz=i;
        if(!zui)break;
        d[wz]--;
        for(int i=wz+1;i<=n;i++)arr[i]=max(arr[i-1],last[i-1])+d[i-1];
    }
    for(int i=1;i<=n;i++)ans+=arr[i]*down[i];
    printf("%d\n",ans);
    return 0;
}

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

posted on 2017-05-14 11:14  Yzyet  阅读(243)  评论(0编辑  收藏  举报