首页 > 代码库 > vijos 1741 观光公交

vijos 1741 观光公交

TMD这种题有什么意思啊。。。敲着都烦啊。。。感觉啥都没有用就敲完了。。。光考个贪心有什么意思啊。

反正不想写。NOIP遇到了。。。管他呢。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 1050
#define maxm 10050
using namespace std;
int n,m,k,t[maxm],a[maxm],b[maxm],d[maxn],mx[maxn],arr[maxn],sum[maxn],nxt[maxn],ans=0;
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for (int i=2;i<=n;i++) scanf("%d",&d[i]);
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&t[i],&a[i],&b[i]);
        mx[a[i]]=max(mx[a[i]],t[i]);sum[b[i]]++;
    }
    for (int i=1;i<=n;i++) sum[i]+=sum[i-1];
    while (k)
    {
        for (int i=1;i<n;i++) arr[i+1]=max(arr[i],mx[i])+d[i+1];
        nxt[n-1]=n;
        for (int i=n-2;i>=1;i--)
        {
            if (mx[i+1]>=arr[i+1]) nxt[i]=i+1;
            else nxt[i]=nxt[i+1];
        }
        int ret=0,pos;
        for (int i=1;i<=n-1;i++)
        {
            if ((ret<sum[nxt[i]]-sum[i]) && (d[i+1]))
            {
                ret=sum[nxt[i]]-sum[i];
                pos=i+1;
            }    
        }
        if (!ret) break;
        d[pos]--;k--;
    }
    for (int i=1;i<n;i++) arr[i+1]=max(arr[i],mx[i])+d[i+1];
    for (int i=1;i<=m;i++) ans+=arr[b[i]]-t[i];
    printf("%d\n",ans);
    return 0;
}

 

vijos 1741 观光公交