• POJ 3253


    题意

    切割木板, 比如一根长21的木板要切割成5, 8, 8的三块, 每次切割花费的金额为两断的长度. 比如先把21切成16和5, 花费21元, 再把16切成8和8, 花费16元, 总计消费37元. 若先把21切成13和8, 花费21元, 再把13切成8和5, 花费13元, 总计消费34元, 花销更少
    现在就要求出最小开销

    思路

    这道题可以用贪心, 这里主要记录一下白书上提供的优先队列 这个非常好的思路
    把切割逆向看作拼接过程, 定义一个从小到大排列的优先队列

    priority_queue<int, vector<int>, greater<int> > fen;

    每次取出最短的两根木板拼接, 再将这个拼接后的长木板推入优先队列
    直到fen.size() == 1, 这时木板被拼接完毕

    记得看数据范围需要用long long !!

    AC代码

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    
    using namespace std;
    const int maxn = 20000 + 100;
    priority_queue<int, vector<int>, greater<int> > fen;
    typedef long long LL;
    //int s[maxn];
    
    int main()
    {
        int n, a;
        while( ~scanf("%d",&n) )
        {
            LL sum = 0;
            while( !fen.empty() ) fen.pop();
            for( int i = 0; i < n; i++ ){
                scanf("%d",&a);
                fen.push(a);
            }
            while( fen.size() > 1 ){
                int l1 = fen.top();
                fen.pop();
                int l2 = fen.top();
                fen.pop();
                sum += l1 + l2;
                fen.push(l1+l2);
            }
            printf("%lld
    ",sum);
        }
        return 0;
    }
  • 相关阅读:
    sql TRUNCATE 和 delete 的区别
    visual studio 2005 service pack 1
    gac 详细的步骤
    简单判断用户重复登录,记录一下
    [转]在SQL Server中使用CLR调用.NET方法
    xml 解析之 JDOM解析
    Java反射机制——反射 API(Day_04)
    结合JVM 浅谈Java 类加载器(Day_03)
    jsoup select 选择器(Day_02)
    SQLite在Android中的使用
  • 原文地址:https://www.cnblogs.com/JinxiSui/p/9740588.html
Copyright © 2020-2023  润新知