zoukankan      html  css  js  c++  java
  • NOIP2011DAY2T3观光公交

    描述

    风景迷人的小城Y 市,拥有n 个美丽的景点。由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2、3 、4 ……n 号景点。从第 i 号景点开到第 i+1 号景点需要 Di 分钟。任意时刻,公交车只能往前开,或在景点处等待。

    设共有m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点 Ai ,希望乘车前往景点Bi (Ai<Bi )。为了使所有乘客都能顺利到达目的地,公交车在每站都必须等待需要从该景点出发的所有乘客都上车后才能出发开往下一景点。

    假设乘客上下车不需要时间。

    一个乘客的旅行时间,等于他到达目的地的时刻减去他来到出发地的时刻。因为只有一辆观光车,有时候还要停下来等其他乘客,乘客们纷纷抱怨旅行时间太长了。于是聪明的司机ZZ给公交车安装了 k 个氮气加速器,每使用一个加速器,可以使其中一个 Di 减1 。对于同一个Di 可以重复使用加速器,但是必须保证使用后Di 大于等于0 。

    那么ZZ该如何安排使用加速器,才能使所有乘客的旅行时间总和最小?

    输入

    第1 行是3 个整数n, m, k ,每两个整数之间用一个空格隔开。分别表示景点数、乘客数和氮气加速器个数。

    第2 行是n-1 个整数,每两个整数之间用一个空格隔开,第i 个数表示从第i 个景点开往第i+1 个景点所需要的时间,即 Di 。

    第3 行至m+2 行每行3 个整数 Ti, Ai, Bi,每两个整数之间用一个空格隔开。第 i+2 行表示第i 位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。

    输出

    共一行,包含一个整数,表示最小的总旅行时间。

    样例输入[复制]
    3 3 2
    1 4
    0 1 3
    1 1 2
    5 2 3
    样例输出[复制]
    10
    提示

    输入输出样例说明】

    对D2 使用2 个加速器,从2 号景点到 3 号景点时间变为 2 分钟。

    公交车在第1 分钟从1 号景点出发,第2 分钟到达2 号景点,第5 分钟从2 号景点出发,第7 分钟到达 3 号景点。

    第1 个旅客旅行时间 7-0 = 7 分钟。

    第2 个旅客旅行时间 2-1 = 1 分钟。

    第3 个旅客旅行时间 7-5 = 2 分钟。

    总时间 7+1+2 = 10分钟。

    【数据范围】

    对于10% 的数据,k=0 ;

    对于20% 的数据,k=1 ;

    对于40% 的数据,2 ≤ n ≤ 50,1 ≤ m ≤ 1,000,0 ≤ k ≤ 20,0 ≤ Di ≤ 10,0 ≤ T i ≤ 500;

    对于60% 的数据,1 ≤ n ≤ 100,1 ≤ m ≤ 1,000,0 ≤ k ≤ 100 ,0 ≤ Di ≤ 100,0 ≤ T i ≤ 10,000 ;

    对于100%的数据,1 ≤ n ≤ 1,000,1 ≤ m ≤ 10,000 ,0 ≤ k ≤ 100,000,0 ≤ Di ≤ 100 ,0 ≤ T i ≤ 100,000。

    标签
    NOIP2011提高组
     
    题解明天来补,代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<algorithm>
     5 using namespace std;
     6 priority_queue<int,vector<int>,greater<int> >q;
     7 int timee[1000005],range[1000006],sum[1000006],out[1000005],lastt[1000006],d[1000005],t[1000005],a[1000005],b[1000005];
     8 int main() {
     9     int n,m,k,ans=0;
    10     cin>>n>>m>>k;
    11     for(int i=1; i<n; i++)
    12         cin>>d[i];
    13     for(int i=1; i<=m; i++) {
    14         cin>>t[i]>>a[i]>>b[i];
    15         lastt[a[i]]=max(lastt[a[i]],t[i]);//计算人最晚到达车站的时间
    16         out[b[i]]++;
    17     }
    18     for(int i=1; i<n; i++) //计算每个站的到达时间,是由上一个站的时间与上一个站到达的最大值加上路程的时间
    19         timee[i+1]=max(timee[i],lastt[i])+d[i];
    20     for(int i=1; i<=n; i++)sum[i]=sum[i-1]+out[i];
    21     lastt[n]=99999999;
    22     for(int i=1; i<=m; i++)ans+=timee[b[i]]-t[i];
    23     while(k--) {
    24         int max0=0,now;
    25         range[n-1]=n;
    26         for(int i=n-2; i>=1; i--) {
    27             if(timee[i+1]>lastt[i+1]) { //在这里减少了不会停留,也是为什么必须是大于的原因
    28                 range[i]=range[i+1];//就可以直接到下一个站
    29             } else {
    30                 range[i]=i+1;    
    31             }
    32         }
    33         for(int i=1;i<n;i++){
    34             if(sum[range[i]]-sum[i]>max0&&d[i])
    35             max0=sum[range[i]]-sum[i],now=i;
    36         }
    37         if(!max0)break;
    38         d[now]--;
    39         ans-=max0;
    40         timee[1]=0;
    41         for(int i=1;i<n;i++)timee[i+1]=max(timee[i],lastt[i])+d[i];
    42     }
    43     cout<<ans;
    44     return 0;
    45 }

    蜜汁贪心

  • 相关阅读:
    CloudNotes之桌面客户端篇:将笔记发布到博客园
    CloudNotes之桌面客户端篇:笔记撰写样式的支持
    Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架
    CloudNotes之桌面客户端篇:插件系统的实现
    CloudNotes之领域建模篇:领域模型简介
    CloudNotes云端个人笔记系统系列文章汇总
    将Json数据转换为ADO.NET DataSet对象
    CloudNotes之桌面客户端篇:增强的笔记列表
    CloudNotes:一个云端个人笔记系统
    一种通用查询语言的定义与实践
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9665216.html
Copyright © 2011-2022 走看看