• [NOIP2018(PJ)] 摆渡车


    题目链接

    题意

      有 $n$ 个同学在等车,每位同学从某时刻开始等车,相邻两趟车之间至少间隔 $m$ 分钟。凯凯可以任意安排发车时间,求所有同学等车时间之和的最小值。

    分析

      这题首先能想到是动态规划

      很明显先要对每个人开始等待的时间进行排序

      如果设 $f[i]$ 为前 $i$ 个人都已离开的最少等车时间,由于这样做发车时间与每个人上车时间不好确定,所以考虑加一维

      设 $f[i][j]$ 为第 $i$ 个人等待的第 $j$ 分钟时,前 $i$ 个人都已恰好离开时的最少等车时间之和

      我们可以枚举 $i$ 和 $j$,同时对 $i$ 后面的同学的值进行更新

      此时第 $k \, (k>i)$ 个人等车的时间 $now$ 为 $max(t[i]+j+m-t[k],0)$

      所以 $f[k][now]=f[i][j]+sumlimits_{x=i+1}^k (now+t[k]-t[x])$

      但是求和又会增加一维时间复杂度,于是可以先预处理出 $t[i]$ 的前缀和 $s[i]$

      然后 $f[k][now]=f[i][j]+(now+t[k]) imes (k-i)-(s[k]-s[i])$

      最后在 $n$ 位同学都已离开的情况中找出最小值

      时间复杂度为 $O(n^2 m)$,但实际上要比这个小很多

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include <cmath>
    using namespace std;
    #define ll long long
    #define inf 0x3f3f3f3f
    #define N 505
    
    int n, m, ans = inf;
    int t[N], s[N], f[N][N];
    
    int main() {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++)
            scanf("%d", t + i);
        sort(t + 1, t + n + 1);
        for (int i = 1; i <= n; i++)
            s[i] = s[i - 1] + t[i];
        t[0] = -inf;
        memset(f, 0x3f, sizeof f);
        f[0][0] = 0;
        for (int i = 0; i <= n; i++) {
            int mj = min(m - 1, t[i + 1] - t[i]);
            for (int j = 0; j <= mj; j++)
                if (f[i][j] != inf)
                    for (int k = 1; i + k <= n; k++) {
                        int now = max(t[i] + j + m - t[i + k], 0);
                        f[i + k][now] = min(f[i + k][now],
                            f[i][j] + (t[i + k] + now) * k - (s[i + k] - s[i]));
                    }
        }
        for (int i = 0; i < m; i++)
            ans = min(ans, f[n][i]);
        printf("%d
    ", ans);
    
        return 0;
    }
    View Code
  • 相关阅读:
    近期需要学习的
    sdfsdf
    思路绝对清楚,手段绝对下流【转】
    一宅镇京华——看谁还敢在我面前吹丫有钱 
    白天求生存,晚上求发展
    Ten Places to Go for SharePoint Development Information
    Life Record
    Custom Search Result Style Based On SharePoint Xslt Search Result Style
    软考信息系统项目管理师考试记录
    什么是Microsoft SharePoint 2010
  • 原文地址:https://www.cnblogs.com/Pedesis/p/11030178.html
Copyright © 2020-2023  润新知