joy很喜欢玩某个游戏。 这个游戏有N个遗迹,编号从1到N,可以按照喜欢的顺序探索。 在游戏中可以获得宝石共有M种,从1到M编号。 通过探索遗迹可以获得得分和一些宝石作为报酬。探索遗迹i(1≤i≤N)可以获得得分si分,同时获得编号为li以上ri以下所有宝石各一颗,不能多次探索同一遗迹。 获得的宝石不能扔掉,如果所有种类的宝石都获得了至少一颗的话,魔王会苏醒,灾厄将会笼罩世界,玩家会失去所有得分和宝石。 joy君的目标是尽量提高分数,通过选择合适的遗迹探索,可以最大化魔王复活前的分数。 问可能的最大值是多少。c++代码
时间: 2024-03-23 07:38:06 浏览: 74
这是一道经典的贪心问题,可以按照以下思路来解决:
1. 将所有遗迹按照得分从大到小排序;
2. 从得分最高的遗迹开始探索,将其能够获得的宝石全部记录下来;
3. 对于下一个遗迹,如果它能够获得的所有宝石已经在之前的遗迹中全部获得了,那么就直接跳过它,继续考虑下一个遗迹;
4. 如果下一个遗迹能够获得之前没有获得的宝石,那么就选择它进行探索,并更新已经获得的宝石列表;
5. 重复步骤3和4,直到所有遗迹都被考虑完毕。
下面是C++代码实现:
```c++
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
struct Relic {
int s, l, r;
bool operator < (const Relic& other) const {
return s > other.s;
}
};
int main() {
int n, m;
cin >> n >> m;
vector<Relic> relics(n);
for (int i = 0; i < n; i++) {
cin >> relics[i].s >> relics[i].l >> relics[i].r;
}
sort(relics.begin(), relics.end());
set<int> jewels;
int ans = 0;
for (int i = 0; i < n; i++) {
bool flag = true;
for (int j = relics[i].l; j <= relics[i].r; j++) {
if (!jewels.count(j)) {
jewels.insert(j);
ans += relics[i].s;
flag = false;
break;
}
}
if (flag) {
break;
}
}
cout << ans << endl;
return 0;
}
```
其中,set<int> jewels用于记录已经获得的宝石,jewels.count(j)判断某个宝石是否已经获得过了。
阅读全文