noip2011——提高组——观光公交

Posted Yzyet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了noip2011——提高组——观光公交相关的知识,希望对你有一定的参考价值。

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

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

#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同意,禁止转载,侵权者必究。

以上是关于noip2011——提高组——观光公交的主要内容,如果未能解决你的问题,请参考以下文章

[NOIP2011]观光公交 题解

NOIP2011观光公交

luoguP1315 观光公交 题解(NOIP2011)

vijos 1741 观光公交

NOIP2011提高组(选择客栈)

NOIP2011提高组