首页 > 代码库 > CF #401 (Div. 2) E. Hanoi Factory (栈+贪心)

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;
}

 

CF #401 (Div. 2) E. Hanoi Factory (栈+贪心)