首页 > 其他分享 >P5017 NOIP2018 普及组 摆渡车

P5017 NOIP2018 普及组 摆渡车

时间:2022-11-11 01:22:06浏览次数:77  
标签:接完 ch 公交车 个人 int NOIP2018 摆渡 等待时间 P5017

P5017 NOIP2018 普及组 摆渡车 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

显然要把人按照到达时间排序。然后考虑 dp。

设 \(f(i)\) 表示前 \(i\) 个人已上车或到达目的地,所需最少等待时间。

刷表转移,从 \(f(i)\) 转移到 \(f(j)\),\(j > i\)。而且转移有个条件:我们让公交车接完前 \(i\) 个人回来的时候一次性把 \([i + 1, j]\) 这些人全部接走,也就是一趟搞定,否则会造成转移重复,而且如果运好多趟你会写吗

很显然,\(f(j)\) 等于 \(f(i)\) 加上 \([i + 1, j]\) 这些人的总等待时间。要想知道这些人的总等待时间,就得知道接 \([i +1, j]\) 的这次公交什么时候发车。

那什么时候发车呢?肯定得等到 \(t[j]\) 来了才能发车,但是如果 \(t[j]\) 来的时候,公交车接完前 \(i\) 个人还没回来怎么办?

所以,我们假设公交车接完前 \(i\) 个人回来时,是时刻 \(T'\),那么公交车的发车时间就应该是 \(T = \max(T', t[j])\)。显然不能比这个更早,也不会比这个更晚。

那公交车接完前 \(i\) 个人回来又是什么时候?是 \(t[i] + m\) 吗?并不是,因为上一次接第 \(i\) 个人的那次公交车,可能比第 \(i\) 个人晚到,也就是还得考虑第 \(i\) 个人等待了一会。

所以顺利成章更换 dp 状态:设 \(f(i, k)\) 表示前 \(i\) 个人已上车或达到目的地,第 \(i\) 个人等了 \(k\) 分钟时,所需最少等待时间。

那么公交车接完前 \(i\) 个人回来是 \(T' = t[i] + k + m\),接 \([i + 1, j]\) 这批人的公交车的发车时间就是 \(T = \max(t[i] + k + m, t[j])\),这些人人的等待时间为 \(\sum\limits_{x = i + 1} ^ j T - t[x]\)。拆成 \(T \times (j - i) - \sum t[i \cdots j]\),就变成了一个 \(\mathcal{O}(1)\) 可以计算的式子了(后面那个和,循环同时统计即可,或者直接前缀和优化)。

喜提转移方程一枚:

\[f(j, T - t[j]) \stackrel{\min}{\gets} f(i, k) + T \times (j - i) - \sum t[i \cdots j], T = \max(t[i] + k + m, t[j]) \]

其中 \(a \stackrel{\min}{\gets} b\) 意为 \(a \gets \min(a, b)\)。

\(f(i, k)\) 中 \(k\) 的范围:\([0, \min(m - 1, t[i + 1] - t[i])]\)。这是因为如果 \(t[i]\) 等车等到 \(t[i + 1]\) 一起来了,那么这次来车肯定要把 \(t[i + 1]\) 一起接走而不是只接走 \(t[i]\)(第 \(i + 1\) 个人:你最好有事)

初始状态:\(t[0] = -\infty\),\(f(0, 0) = 0\),其它 \(f\) 均为 \(+\infty\)。

/*
 * @Author: crab-in-the-northeast 
 * @Date: 2022-11-11 00:44:12 
 * @Last Modified by: crab-in-the-northeast
 * @Last Modified time: 2022-11-11 01:15:49
 */
#include <bits/stdc++.h>
inline int read() {
    int x = 0;
    bool f = true;
    char ch = getchar();
    for (; !isdigit(ch); ch = getchar())
        if (ch == '-')
            f = false;
    for (; isdigit(ch); ch = getchar())
        x = (x << 1) + (x << 3) + ch - '0';
    return f ? x : (~(x - 1));
}
inline int max(int a, int b) {
    return a > b ? a : b;
}
inline int min(int a, int b) {
    return a < b ? a : b;
}
inline bool gmi(int &a, int b) {
    return b < a ? a = b, true : false;
}

const int maxn = 505;
const int maxm = 105;

int t[maxn], f[maxn][maxm];

int main() {
    int n = read(), m = read();
    for (int i = 1; i <= n; ++i)
        t[i] = read();
    std :: sort(t + 1, t + 1 + n);

    t[0] = -105;
    std :: memset(f, 0x7f, sizeof(f));
    f[0][0] = 0;

    for (int i = 0; i <= n; ++i) {
        for (int k = 0; k <= min(m - 1, t[i + 1] - t[i]); ++k) {
            if (f[i][k] == 0x7f7f7f7f)
                continue;
            for (int j = i + 1, tot = t[i + 1]; j <= n; ++j, tot += t[j]) {
                int T = max(t[i] + k + m, t[j]);
                gmi(f[j][T - t[j]],
                f[i][k] + T * (j - i) - tot);
            }
        }
    }

    int ans = INT_MAX;
    for (int k = 0; k < m; ++k)
        gmi(ans, f[n][k]);
    printf("%d\n", ans);
    return 0;
}

标签:接完,ch,公交车,个人,int,NOIP2018,摆渡,等待时间,P5017
From: https://www.cnblogs.com/crab-in-the-northeast/p/luogu-p5017.html

相关文章

  • 解决网络隔离后的数据摆渡难题,需要这个跨网文件交换产品
    随着互联网技术的成熟和高速发展,越来越多的企业和事业单位在使用无纸化办公,实现办公自动化与信息共享。但是随之而来的就是数据安全问题,近年来网络安全问题也频发。目前......
  • 做题记录整理图论/dfs P5022 [NOIP2018 提高组] 旅行(2022/10/19)
    P5022[NOIP2018提高组]旅行我只想出了部分分的解法。。。https://fzy.blog.luogu.org/solution-p5022#include<bits/stdc++.h>#definefor1(i,a,b)for(inti=a;i......
  • [NOIP2018 提高组] 铺设道路 贪心证明
    首先,这个是本蒟蒻第一次正经证明贪心,方法肯定有些繁琐(知识有限),仅作纪念。证明:记\(f(x)\)为序列中从第\(1\)到第\(x\)个数满足题意的最小天数。对于非上升序列\(\{a_1,a......
  • NOIP2018 day1 题解
    心血来潮看了看18年的联赛,感觉自己进步很大==T1对于一个“波”来说,显然需要的次数为最大的数(波峰),对于多个“波”,就每次记录一下从波底到波峰的高度差即可,这可以用差分简......
  • P5021 [NOIP2018 提高组] 赛道修建 思路简记
    发现答案具有单调性,尝试一下二分答案能不能做二分答案\(t\)后,问题的关键就变成最多能找到多少条长度大于等于\(t\)的赛道我们先假设整棵树以\(1\)为根把样例的图......
  • 雅礼NOIP2018集训 day5
    雅礼NOIP2018集训day5联题面由于出题人懒所以没有背景。一个无限长的01序列,初始全为0,每次选择一个区间[l,r]进行操作,有三种操作:•1lr将[l,r]中所有元素变......
  • 雅礼NOIP2018集训 day5 赛
    雅礼NOIP2018集训day5赛题面由于出题人思维枯竭所以想不出好玩的背景。有n个物品,第i个物品的价格是vi,有两个人,每个人都喜欢n个物品中的一些物品。要求选出正......
  • 雅礼NOIP2018集训 day3 u
    雅礼NOIP2018集训day3u题面考虑一个\(n*n\)的矩阵\(A\),初始所有元素均为\(0\)。执行\(q\)次如下形式的操作:给定\(4\)个整数\(r,c,l,s\),对于每个满足\(x\in[r,r+l),y\in......
  • 内外网文件摆渡 需要什么样的跨网文件传输系统?
    内外网隔离可以有效的保障了信息的对外安全性,但是在实际应用过程中,为了满足部门业务需求,内网和外网之间仍需要进行大量必要的数据交换,也称为数据摆渡。所以数据摆渡这一概......
  • 传球游戏【NOIP2018普及组T3】(ybtoj 递推例题2)
    题目描述上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。游戏规则是这样的: 个同学站成一个圆圈,其中的一个同学手里拿着一......