uva-10954-贪心

题意:俩个数相加,产生的和就是这次加法的代价,问,所有数都加起来,最小代价是多少

解题思路:贪心,每次都选取最小俩个数相加,如果只有一个数,计算完毕,注意,加法的和要再次入队列。

#include <string>
#include<iostream>
#include<map>
#include<memory.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<vector>


namespace cc
{
    using std::cout;
    using std::endl;
    using std::cin;
    using std::map;
    using std::vector;
    using std::string;
    using std::sort;
    using std::priority_queue;
    using std::greater;
    using std::vector;

    constexpr int N = 5000;

    priority_queue<int,vector<int>, greater<int> >q;
    void read(int n)
    {
        while (q.empty() == false)
            q.pop();
        int k = 0;
        while (n--)
        {
            cin >> k;
            q.push(k);
        }
    }

    void solve()
    {

        int n;
        while (cin >> n && n)
        {
            read(n);
            int cost = 0;
            
            while (q.empty() == false)
            {
                int sum = 0;
                int i = q.top();
                q.pop();
                if (q.empty() == true)
                    break;
                int k = q.top();
                q.pop();
                sum = i + k;
                cost =cost+sum;
                q.push(sum);
            }
            cout << cost << endl;
        }
    }

};


int main()
{

#ifndef ONLINE_JUDGE
    freopen("d://1.text", "r", stdin);
#endif // !ONLINE_JUDGE
    cc::solve();

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/shuiyonglewodezzzzz/p/9941001.html
今日推荐