CF #401 (Div. 2) E. Hanoi Factory (栈+贪心)
题意:给你一堆汉诺塔的盘子,设内半径为a,设外半径为b,高度为h,如果bj ≤ bi 同时bj > ai 我们就认为i盘子能落在在j盘子上,问你最高能落多高
思路:一看题意我们就能想到贪心,首先我们对这些圆盘先按照b从大到小排序,如果b相同,那么就要按照a从大到小排序,其实落汉诺塔的过程就像在栈一样,先进后出,所以我们可以用栈来模拟落汉诺塔的过程,如果当前的不能落上我们就把最上面的盘子拿走,直到能落下一个盘子,每一次都计算一下当前的高度,并判断是否达到最高即可
代码:
#include <bits/stdc++.h> #define maxn 100005 #define ll long long using namespace std; struct node { int a,b,h; }; bool cmp(node a,node b) { if (a.b>b.b) { return true; } else if (a.b==b.b) { if(a.a>b.a) return true; else return false; } else return false; } int main() { int n; node data[maxn]; while(cin>>n) { for (int i = 0; i < n; ++i) { scanf("%d %d %d",&data[i].a,&data[i].b,&data[i].h); } sort(data,data+n,cmp); stack <node> s; while(!s.empty()) { s.pop(); } s.push(data[0]); ll ans=data[0].h; ll sum=data[0].h; for (int i = 1; i < n; ++i) { while(!s.empty()&&data[i].b<=(s.top()).a) { sum-=(s.top()).h; s.pop(); } sum+=data[i].h; ans=max(ans,sum); s.push(data[i]); } cout<<ans<<endl; } return 0; }