zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    Codeforces 916E Jamie and Tree (换根讨论)
    BZOJ 3083 遥远的国度 (换根讨论 + 树链剖分)
    Codeforces 703D Mishka and Interesting sum(离线 + 树状数组)
    ECNU 3480 没用的函数 (ST表预处理 + GCD性质)
    HDU 4343 Interval query(贪心 + 倍增)
    Codeforces 147B Smile House(DP预处理 + 倍增)
    HDU 4870 Rating (高斯消元)
    TopCoder SRM 301 Div2 Problem 1000 CorrectingParenthesization(区间DP)
    Hrbust 2320 OX (博弈)
    Hrbust 2319 Number Game(贪心)
  • 原文地址:https://www.cnblogs.com/EDGsheryl/p/9153687.html
Copyright © 2011-2022 走看看