zoukankan      html  css  js  c++  java
  • 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补充
    SQL练习题
    HDU 2907
    Codeforces 814D
    Codeforces 814C
    Codeforces 1004D
    Codeforces 1004E
    CodeForces 909F
    CodeForces 909E
    CodeForces 909D
  • 原文地址:https://www.cnblogs.com/JinxiSui/p/9740588.html
Copyright © 2011-2022 走看看