• Codeforces Round #486 (Div. 3) F. Rain and Umbrellas


    Codeforces Round #486 (Div. 3) F. Rain and Umbrellas

    题目连接:

    http://codeforces.com/group/T0ITBvoeEx/contest/988/problem/E

    Description

    Polycarp lives on a coordinate line at the point x=0. He goes to his friend that lives at the point x=a. Polycarp can move only from left to right, he can pass one unit of length each second.

    Now it's raining, so some segments of his way are in the rain. Formally, it's raining on n non-intersecting segments, the
    i-th segment which is in the rain is represented as [li,ri] (0≤li<ri≤a).

    There are m umbrellas lying on the line, the i-th umbrella is located at point xi (0≤xi≤a) and has weight pi. When Polycarp begins his journey, he doesn't have any umbrellas.

    During his journey from x=0 to x=a Polycarp can pick up and throw away umbrellas. Polycarp picks up and throws down any umbrella instantly. He can carry any number of umbrellas at any moment of time. Because Polycarp doesn't want to get wet, he must carry at least one umbrella while he moves from x to x+1 if a segment [x,
    x+1] is in the rain (i.e. if there exists some i such that li≤x and x+1≤ri).

    The condition above is the only requirement. For example, it is possible to go without any umbrellas to a point where some rain segment starts, pick up an umbrella at this point and move along with an umbrella. Polycarp can swap umbrellas while he is in the rain.

    Each unit of length passed increases Polycarp's fatigue by the sum of the weights of umbrellas he carries while moving.

    Can Polycarp make his way from point x=0 to point x=a? If yes, find the minimum total fatigue after reaching x=a, if Polycarp picks up and throws away umbrellas optimally.

    Sample Input

    10 2 4
    3 7
    8 10
    0 10
    3 4
    8 1
    1 2
    
    

    Sample Output

    14
    
    

    题意

    有几段下雨的地方,有几把雨伞在地上,消耗的值为伞的重量*移动距离,问在不被淋湿的情况下,如何打伞消耗最小

    题解:

    dp[i]指的是从第i把伞开始打之后的最小消耗,他由dp[j] (j>i)转移而来。
    时间复杂度O(m^2)

    代码

    #include <bits/stdc++.h>
    
    using namespace std;
    
    pair<int, int> r[2010];
    pair<int, int> u[2010];
    int n, m, a;
    int h[2010];
    int ans;
    const int INF = 0x7fffffff;
    int st, fn;
    
    int main() {
        //freopen("1.txt","r",stdin);
    
        cin >> a;
        cin >> n >> m;
        st = INF;
        fn = 0;
        for (int i = 0; i < n; i++) {
            cin >> r[i].first >> r[i].second;
            st = min(st, r[i].first);
            fn = max(fn, r[i].second);
        }
        for (int i = 0; i < m; i++) cin >> u[i].first >> u[i].second;
        sort(u, u + m, [](const pair<int, int> &p, const pair<int, int> &q) { return p < q; });
        for (int i = 0; i <= m; i++) {
            h[i] = INF;
        }
        sort(r, r + n, [](const pair<int, int> &p, const pair<int, int> &q) { return p < q; });
        for (int i = m - 1; i >= 0; i--) {
            int index;
            for (index = n - 1; index >= 0; index--)
                if (r[index].first < u[i].first) break;
            int cur = (fn > u[i].first ? fn - u[i].first : 0) * u[i].second;
            h[i] = min(h[i], cur);
    
            for (int j = 0; j < i; j++) {
                int cur;
                if (r[index].second > u[j].first) {
                    cur = (min(r[index].second, u[i].first) - u[j].first) * u[j].second;
                } else {
                    cur = 0;
                }
                h[j] = min(h[j], h[i] + cur);
            }
        }
    
        ans = INF;
        for (int i = 0; i < m; i++) {
            if (u[i].first <= st) ans = min(ans, h[i]);
        }
        if (ans == INF) ans = -1;
        cout << ans << endl;
    }
    
  • 相关阅读:
    BUUCTF--Youngter-drive
    BUUCTF--CrackRTF
    FireShell CTF 2020 Re Simple Encryption
    2020 美国大学生数学建模论文翻译(week 2)
    仿射密码
    乘法逆元
    RC4加密与解密
    2020 BJDCTF Re encode
    2020美国大学生数学建模(MCM/ICM)A题数据及参考资料
    路由器, 美团笔试题, 差分
  • 原文地址:https://www.cnblogs.com/EDGsheryl/p/9153687.html
Copyright © 2020-2023  润新知