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;
    }
    
  • 相关阅读:
    springboot jpa junit测试遇到的问题
    解决Eclipse中.properties文件中文乱码问题
    java 学习笔记(五) Zookeeper的集群配置和Java测试程序
    Kotlin编译器使用及反编译分析
    Kotlin重新学习及入门示例
    SATB的标记问题解决之道与G1垃圾收集模式系统详解及最佳实践
    SATB深入详解与问题剖析【纯理论】
    三色标记算法在并发情况下的漏标问题分析【纯理论】
    G1混合式GC与三色标记算法详解【纯理论】
    G1垃圾收集器深度理论讲解【纯理论】
  • 原文地址:https://www.cnblogs.com/EDGsheryl/p/9153687.html
Copyright © 2011-2022 走看看