zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    List接口的实现类
    Java 容器概述
    PayPal支付接口方式(checkout)集成
    Java Bio、Nio、Aio区别
    Java Aio
    Java Nio
    Java Bio
    Java Io流
    Java 23种设计模式
    SQL检测超时工具类
  • 原文地址:https://www.cnblogs.com/simplekinght/p/6613631.html
Copyright © 2011-2022 走看看