码迷,mamicode.com
首页 > 其他好文 > 详细

luoguP1315 观光公交 题解(NOIP2011)

时间:2018-04-05 11:35:14      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:cti   log   down   公交   cstring   include   return   rri   lse   

P1315 观光公交 题目

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<ctime>
#include<queue>
#include<stack>
#define rg register
#define lst long long
#define N 1050
#define M 10050
using namespace std;

int n,m,k,num[N],u,v,w;
int down[N],up[N],ans;
int arrive[N],peo[N];
int val,idx;

inline int read()
{
    rg int s=0,m=1;rg char ch=getchar();
    while(ch!=-&&(ch<0||ch>9))ch=getchar();
    if(ch==-)m=-1,ch=getchar();
    while(ch>=0&&ch<=9)s=(s<<3)+(s<<1)+ch-0,ch=getchar();
    return s*m;
}

int main()
{
//    freopen("s.in","r",stdin);
    n=read(),m=read(),k=read();
    for(rg int i=1;i<n;++i)num[i]=read();
    for(rg int i=1;i<=m;++i)
    {
        u=read(),v=read(),w=read();
        ans-=u,down[w]++,up[v]=max(u,up[v]);
    }
    while(k--)
    {
        memset(peo,0,sizeof(peo));
        for(rg int i=2;i<=n;++i)
            arrive[i]=max(arrive[i-1],up[i-1])+num[i-1];
        for(rg int i=n;i>=2;--i)
        {
            if(num[i-1])
            {
                peo[i-1]=down[i];
                if(arrive[i]>up[i])
                    peo[i-1]+=peo[i];
            }
            else peo[i-1]=0;
        }
        val=0,idx=-1;
        for(rg int i=1;i<=n;++i)
            if(val<peo[i])val=peo[i],idx=i;
        if(idx==-1)break;
        num[idx]--;
    }
    for(rg int i=2;i<=n;++i)
        arrive[i]=max(arrive[i-1],up[i-1])+num[i-1];
    for(rg int i=1;i<=n;++i)ans+=arrive[i]*down[i];
    printf("%d\n",ans);
    return 0;
}

 

luoguP1315 观光公交 题解(NOIP2011)

标签:cti   log   down   公交   cstring   include   return   rri   lse   

原文地址:https://www.cnblogs.com/cjoierljl/p/8721092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!