NOIP观光公交

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0' || ch>'9')
    {
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}

int n,m,k,d[1005],maxt[1005],sum[1005],g[1005],t[10005],car[1005],a[10005],b[10005];
int ans,maxn,fast;
int i;

int main()
{
    n=read(); m=read(); k=read();
    for(i=1;i<n;i++) d[i]=read();
    for(i=1;i<=m;i++)
    {
        t[i]=read(); a[i]=read(); b[i]=read();
        maxt[a[i]]=max(maxt[a[i]],t[i]);
        sum[b[i]]++;
    }
    for(i=2;i<=n;i++) sum[i]+=sum[i-1];
    car[1]=maxt[1];
    for(i=2;i<=n;i++)
    {
        car[i]=max(car[i-1],maxt[i-1]);
        car[i]+=d[i-1];
    }
    
    for(i=1;i<=m;i++)
    {
        ans+=car[b[i]]-t[i];
    }
    
    while(k--)
    {
        g[n]=g[n-1]=n;
        maxn=0;
        for(i=n-2;i>=1;i--)
        {
            if(car[i+1]<=maxt[i+1])
                g[i]=i+1;
            else g[i]=g[i+1];
        }
        for(i=1;i<n;i++)
        {
            if(sum[g[i]]-sum[i]>maxn && d[i]!=0)
            {
                maxn=sum[g[i]]-sum[i];
                fast=i;
            }
        } 
        ans-=maxn;
        d[fast]--;
        for(i=2;i<=n;i++)
        {
            car[i]=max(car[i-1],maxt[i-1]);
            car[i]+=d[i-1];
        }
    }
    printf("%d",ans);
    return 0;
}
观光公交

猜你喜欢

转载自www.cnblogs.com/llllllpppppp/p/9125608.html
今日推荐