P1315 观光公交 贪心

 
          P1315 观光公交

贪心

题目链接:https://www.luogu.org/problemnew/show/1315

哇,这个题贪心?好高级的贪心……完全没看出来QAQ

看到这个题,

刚开始想能不能dp,

然后某大神说不满足无后效性,

首先对于每个点当然是能走就走,

不能走就等待,这是无法控制的。

所以只考虑氮气加速器加在哪里可以使时间总和尽量少。

后效性:

如果选择加速,可能会使后面等待的时间更长,或者更短,对后面都会有影响。

虽然dp不行,但是可以受启发,着这一条边加速会影响后面的所有边么?

不一定。

来来来,分类讨论。


①到下一个点还需要等待:以后的时间就不再影响了


②到下一个点不需要等待:对以后的时间还会加速直到……出现情况一(或者到最后一个点)!!

即每次用加速器都会对后面的人有影响,

用sum[i]记录到i的人数,前缀和处理,g[i]代表每个点所能影响到的最远点,

那么sum[i + g[i]] - sum[i] 即是能影响到的人数

这样就很容易想到选择影响尽量大的点减掉,(这里贪心)

定义数组 :

last[ i ] : 最后一个人到达i站点的时间。

sum[ i ] : 到i站点的总人数。

enter[ i ] : 公交车到i站点的最少时间(用last和enter来更新g,想想怎么更新)。

g[ i ] : 每个站点所能影响到的最远站点,即要求的影响。

Codes:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 20000 + 10;
int n,m,k;
int dis[N],last[N],g[N],enter[N];
int ans,sum[N],maxx = -1;
struct node{
    int time,start,end;
}a[N];
void init(){
    for(int i = 1;i <= m;++ i){
        last[a[i].start] = max(last[a[i].start],a[i].time);//最后一个人到a[i].start站点的时间
        //和到这个点的时间取max
        sum[a[i].end] ++;
    }
    enter[1] = last[1];
    for(int i = 1;i <= n;++ i){
        sum[i] += sum[i - 1];//到i站点的总人数 前缀和处理
    }
    for(int i = 2;i <= n;++ i){
        enter[i] = max(enter[i - 1],last[i - 1]) + dis[i - 1];//公车到i站点的最少时间
            //和最后到的时间取max
    }
    for(int i = 1;i <= m;++ i)
        ans += enter[a[i].end] - a[i].time;//处理出不加加速器的answer,后面就可以直接减啦~
    return;
}
void work(int k){
    for(;k;-- k){
        g[n] = g[n - 1] = n;
        int tar;
        maxx = -1;
        for(int i = n - 2;i >= 1;-- i){
            if(enter[i + 1] <= last[i + 1])//下一个点如果等待
                g[i] = i + 1;//最多影响到下一个
            else //不等待
                g[i] = g[i + 1];//继续减少后面的时间
        }
        for(int i = 1;i < n;++ i){//for边数
            int tmp = sum[g[i]] - sum[i];//最多影响的人数
            if(tmp > maxx && dis[i] > 0){
                maxx = tmp;
                tar = i;//标记最优情况减的点
            }
        }
        ans -= maxx;//更新ans
        dis[tar] --;//减掉dis
        for(int i = 2;i <= n;++ i){
            enter[i] = max(enter[i - 1],last[i - 1]) + dis[i - 1];//重新更新enter
        }
    }
    return;
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i = 1;i < n;++ i){
        scanf("%d",&dis[i]);
    }
    for(int i = 1;i <= m;++ i){
        scanf("%d%d%d",&a[i].time,&a[i].start,&a[i].end);
    }
    init();
    work(k);
    cout << ans << ‘\n‘;
    return 0;
}

MAS:

贪心真的是智商题QAQ,还是要多练吧。

时间: 2024-10-06 23:14:00

P1315 观光公交 贪心的相关文章

[NOIP2011] 提高组 洛谷P1315 观光公交

题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2.3 .4 ……n 号景点.从第 i 号景点开到第 i+1 号景点需要 Di 分钟.任意时刻,公交车只能往前开,或在景点处等待. 设共有m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点 Ai ,希望乘车前往景点Bi (Ai<B i ).为了使所有乘客都能顺

NOIP2011 观光公交(贪心)

好吧,看到这道题的题目就晕了,好长一串... 由于找不出来什么特别NB的算法,就上贪心吧... 网上看了下各种题解,对于某个车站i,如果汽车的到达i站的时间比最后一个来到第i站的时间要短的话,我们就可以考虑使用加速器了.因此枚举在哪个车站i使用加速器能够使节约的时间最多,每次使用了加速器后,更新一遍汽车到站的时间.一直不停地找最优的车站使用加速器,直到加速器用光或者用不用加速器都一样的时候就退出循环. 此种写法是一个一个地使用加速器,比较慢,但还是能过完所有点. #include<cstdio>

Luogu P1315 观光公交

# 解题思路 一开始自己想了一个贪心,虽然贪心的主要思路是对的,但并不会统计游客用的旅行时间.所以就去题解里面看看,第一篇是最小费用最大流,会比较麻烦,所以就去看了看底下的贪心,第一篇贪心被卡掉了,看第二篇,嗯,好像还行.再看看第三篇,写的好简略.不过看懂了. 贪心的主要思路就是在经过游客最多的路上使用加速器,但是还要注意,如果在一条路径的终点,有的游客到达的时间比现在公交车到达的时间还要晚的话就没必要用加速器了,因为再早到达你也必须等着游客上车吧. 考虑用优先队列保证得到最大的价值(经过的游客

noip 2011观光公交

P1315 观光公交 95通过 244提交 题目提供者该用户不存在 标签贪心递推2011NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2.3 .4 ……n 号景点.从第 i 号景点开到第 i+1 号景点需要 Di 分钟.任意时刻,公交车只能往前开,或在景点处等待. 设共有m 个游客,

vijos1741 观光公交 (贪心)

https://www.vijos.org/p/1741 P1741观光公交 请登录后递交 标签:NOIP提高组2011[显示标签] 描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游客越来越多,Y市特意安 排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0分钟出现在1号景点,随后依次前往2.3.4……n号景点.从第i号景点开到第i+1 号景点需要Di分钟.任意时刻,公交车只能往前开,或在景点处等待. 设共有m个游客,每位游客需要乘车1次从一个景点到达另一个景点,第i位

【NOIP2011】观光公交

Description 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号景点,随后依次前往2.3.4--n 号景点.从第i 号景点开到第i+1 号景点需要Di 分钟. 任意时刻,公交车只能往前开,或在景点处等待. 设共有m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点Ai,希望乘车前往景点Bi(Ai<bi).为了使所有乘客都能顺利到达目的

观光公交(codevs 1139)

题目描述 Description 风景迷人的小城 Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号景点,随后依次前往2.3.4……n 号景点.从第i 号景点开到第i+1 号景点需要Di 分钟.任意时刻,公交车只能往前开,或在景点处等待.设共有 m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点Ai,希望乘车前往景点Bi(Ai<Bi).为了使所有乘客都能顺

【NOIP 2011】 观光公交

题目描述 Description 风景迷人的小城 Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号景点,随后依次前往2.3.4……n 号景点.从第i 号景点开到第i+1 号景点需要Di 分钟.任意时刻,公交车只能往前开,或在景点处等待.设共有 m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点Ai,希望乘车前往景点Bi(Ai<Bi).为了使所有乘客都能顺

观光公交

题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2.3 .4 ……n 号景点.从第 i 号景点开到第 i+1 号景点需要 Di 分钟.任意时刻,公交车只能往前开,或在景点处等待. 设共有m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点 Ai ,希望乘车前往景点Bi (Ai<B i ).为了使所有乘客都能顺