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.
这个输入处理麻烦,因为格式不一致而且不确定有多少