b_hw/pdd_任务最大得分(堆/multiset)

T 组, 每一组商品 p 的 p[i][0] 表示价值,p[i][1] 表示下架时间,问怎么卖,才能让价值最大。

int T; cin >> T;
    while (T--) {
        int n; cin >> n;
        vector<pair<int, int>> a(n);
        for (int i = 0; i < n; ++i) {
            int s, t; cin >> s >> t;
            a[i] = {s, t}; //第二维是结束时间
        }
        sort(a.begin(), a.end(), [&](auto& A, auto& B) {
            return A.second < B.second || (A.second == B.second && A.first > B.first);
        });

        multiset<int> st;
        int now = 0;
        for (int i = 0; i < n; ++i) {
            if (a[i].second != now) {
                now++;
                st.insert(a[i].first);
            } else if (a[i].first > (*st.begin())) {
                st.erase(st.begin());
                st.insert(a[i].first);
            }
        }
        int ans = 0;
        for (auto it = st.begin(); it != st.end(); it++) {
            ans += *it;
        }
        cout << ans << '\n';
    }

[1,2,15]
[1,3,14]
[3,4,9]
4
1

输出23, 路线1-3-4.虽然不经过2,但是1可以到2,所以算能到达。
输入如上,前三行分别代表景点1到景点2之间有路,距离为15,景点1到景点3之间有路,距离为14,景点3到景点4之间有路,距离为9。
接下来输入一共有多少个景点,下一行是起始景点。问是否能逛完,可以的话求最长路径,否则输出-1.景点数小于100,路径长度小于100,两个景点间路径数小于5000.
这个输入处理麻烦,因为格式不一致而且不确定有多少

上一篇:C++实现信号量


下一篇:C++11 std::atomic