题意:有n个环给你内环半径、外环半径和高度,叠这些环还要满足以下要求:
①:下面的环的外径要>=上面的环外径
②:环不能掉下去,所以下面的环的内径要<上面的环的外径
③:叠出最大高度
题解:贪心+单调栈
上面的外径要小于等于下面的外径,且大于下面的内径。
我们先以外径为第一指标,内径为第二指标进行递减排序。
用栈模拟,依序遍历,若当前的环外径 ≤ 下面环的内径,那么当前及之后的环都不可能叠加上去,然后我们将栈中元素取出,直到找到当前环能够存在的最高位置,更新
a
n
s
ans
ans即可。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<map>
#include<sstream>
#include<iomanip>
#define ll long long
using namespace std;
int n;
ll sum, ans;
struct node {
int wai, nei, h;
}r[100005];
bool cmp(node& a, node& b) {
return a.wai == b.wai ? a.nei > b.nei : a.wai > b.wai;
}
stack<node> s;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d%d%d", &r[i].nei, &r[i].wai, &r[i].h);
sort(r + 1, r + n + 1, cmp);
for (int i = 1; i <= n; i++) {
while (!s.empty() && s.top().nei >= r[i].wai) {
sum -= s.top().h;
s.pop();
}
s.push(r[i]);
sum += r[i].h;
ans = max(ans, sum);
}
printf("%lld\n", ans);
return 0;
}