【jzoj3029】【NOIP2011DAY2】【观光公交】【贪心】

来源:互联网 发布:小说阅读网软件 编辑:程序博客网 时间:2024/06/02 16:21

题目大意

有n个排成一列的公交站,两个站之间要花费一定时间,有一些乘客某个时间从某个站到另一个站,车要等齐人才能开车,我们有k次机会减少两个站的时间,求旅客花的时间最少是多少。

解题思路

计算每个站到达的时间,计算能影响到多少人,贪心地使用每一次机会。

code

#include<cstdio>#include<cstring>#include<algorithm>#define LL long long#define min(a,b) ((a<b)?a:b)#define max(a,b) ((a>b)?a:b)#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)using namespace std;int const maxn=1000;int n,m,k,d[maxn+10],dep[maxn+10],arr[maxn+10],far[maxn+10],cnt[maxn+10],cnt2[maxn+10];int main(){    freopen("d.in","r",stdin);    freopen("d.out","w",stdout);    scanf("%d%d%d",&n,&m,&k);    fo(i,2,n)scanf("%d",&d[i]);    int ans=0;    fo(i,1,m){        int t,a,b;scanf("%d%d%d",&t,&a,&b);ans-=t;        dep[a]=max(dep[a],t);cnt[b]++;    }    fo(i,1,n)cnt[i]+=cnt[i-1];    for(;k;){        fo(i,2,n)arr[i]=max(arr[i-1],dep[i-1])+d[i];        far[n]=n;int mx=-1,pos;        fd(i,n,2){            if((mx<cnt[far[i]]-cnt[i-1])&&(d[i]>0)){                mx=cnt[far[i]]-cnt[i-1];                pos=i;            }            if(arr[i-1]<=dep[i-1])far[i-1]=i-1;            else far[i-1]=far[i];        }        if(mx==-1)break;        d[pos]--;        k--;    }    fo(i,2,n)printf("%d\n",d[i]);    fo(i,2,n)arr[i]=max(arr[i-1],dep[i-1])+d[i];    fo(i,2,n)ans+=arr[i]*(cnt[i]-cnt[i-1]);    printf("%d",ans);    return 0;}
0 0
原创粉丝点击