Luogu P1315 观光公交

# 解题思路

一开始自己想了一个贪心,虽然贪心的主要思路是对的,但并不会统计游客用的旅行时间。所以就去题解里面看看,第一篇是最小费用最大流,会比较麻烦,所以就去看了看底下的贪心,第一篇贪心被卡掉了,看第二篇,嗯,好像还行。再看看第三篇,写的好简略。不过看懂了。

贪心的主要思路就是在经过游客最多的路上使用加速器,但是还要注意,如果在一条路径的终点,有的游客到达的时间比现在公交车到达的时间还要晚的话就没必要用加速器了,因为再早到达你也必须等着游客上车吧。

考虑用优先队列保证得到最大的价值(经过的游客的数量),如果有一个点满足下面的条件:

最晚到达的乘客的到达时间比公交车的到达时间还要晚。

那就将整段路程从这里分开,分别去考虑劈开后的路程。

昨晚上面这些再来考虑如何处理每段路程。找一下这段路程中,每两个点之间的路途上,最短的等待时间,这就是要使用(用作用)的加速器数量的最大值。(因为超过了这个值就不会再有影响了)

# 代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
inline int read() {
    int x = 0, f = 1; char c = getchar();
    while (c < ‘0‘ || c > ‘9‘) {if(c == ‘-‘) f = -1; c = getchar();}
    while (c <= ‘9‘ && c >= ‘0‘) {x = x*10 + c-‘0‘; c = getchar();}
    return x * f;
}
const int maxn = 1003;
struct node {
    int l, r, tim, val;
}tmp;
int n, m, k, v[maxn], a[maxn], b[maxn], d[maxn], ans;
bool operator < (const node &a, const node &b) {
    return a.val < b.val;
}
priority_queue<node> Q;
inline void sol(int l, int r) {
    if(l >= r) return ;
    if(d[l] == 0) {sol(l+1, r); return ;}
    for(int i=l+1; i<r; i++)
        if(a[i] >= b[i]) {
            sol(l, i), sol(i, r);
            return ;
        }
    int mn = d[l], val = v[r];
    for(int i=l+1; i<r; i++) {
        mn = min(mn, b[i]-a[i]);
        val += v[i];
    }
    d[l] -= mn;
    for(int i=l+1; i<r; i++) b[i] -= mn;
    Q.push((node){l, r, mn, val});
}
int main() {
    n = read(), m = read(), k = read();
    for(int i=1; i<n; i++) d[i] = read();
    int x, y, z;
    for(int i=1; i<=m; i++) {
        z = read(), x = read(), y = read();
        a[x] = max(a[x], z);
        ans -= z;
        v[y] ++;
    }
    for(int i=2; i<=n; i++) b[i] = max(b[i-1], a[i-1]) + d[i-1];
    for(int i=2; i<=n; i++) ans += b[i] * v[i];
    for(sol(1, n); !Q.empty()&&k!=0; ) {
        tmp = Q.top(), Q.pop();
        ans -= min(tmp.tim, k) * tmp.val;
        k -= min(tmp.tim, k);
        if(k != 0) sol(tmp.l, tmp.r);
    }
    printf("%d", ans);
}

原文地址:https://www.cnblogs.com/bljfy/p/9703463.html

时间: 2024-10-12 12:37:11

Luogu P1315 观光公交的相关文章

P1315 观光公交 贪心

  P1315 观光公交 贪心 题目链接:https://www.luogu.org/problemnew/show/1315 哇,这个题贪心?好高级的贪心……完全没看出来QAQ 看到这个题, 刚开始想能不能dp, 然后某大神说不满足无后效性, 首先对于每个点当然是能走就走, 不能走就等待,这是无法控制的. 所以只考虑氮气加速器加在哪里可以使时间总和尽量少. 后效性: 如果选择加速,可能会使后面等待的时间更长,或者更短,对后面都会有影响. 虽然dp不行,但是可以受启发,着这一条边加速会影响后面的

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

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

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 ).为了使所有乘客都能顺

vijos 1741 观光公交

TMD这种题有什么意思啊...敲着都烦啊...感觉啥都没有用就敲完了...光考个贪心有什么意思啊. 反正不想写.NOIP遇到了...管他呢. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1050 #define maxm 10050 using namespace std; int n,m,k,t[maxm],a[maxm],b[