问题标题: 酷町堂:4054 切割石头

0
0
已解决
薛乘志
薛乘志
初级启示者
初级启示者

题目链接: 酷町堂:4054

题目:

切割石头 经验值:800

题目描述 Description

石匠想要把一块石头切成N块,每块小石头的重量分别为W1,W2,…,WN(1 <= W1,W2,…,WN <= 1000,且均为整数)个重量单位,(我们认为切割的小石头均为整数个重量单位且没有损失)。石匠发现,每一次切割花费的体力与该石头重量成正比,不妨设切割重量为1的石头花费1单位体力。例如:若N=3,W1 = 3,W2 = 4,W3 = 5,则石头原来的重量为12,石匠可以有多种切法,如:先将12切成3+9.,花费12体力,再将9切成4+5,花费9体力,一共花费21体力;还可以先将12切成4+8,花费12体力,再将8切成3+5,花费8体力,一共花费20体力。显然,后者比前者更省体力。那么,石匠想要完成切割,至少要花费多少体力呢?

输入描述 Input Description

一共输入N+1行
第1行:1个整数N(2 <= N <= 50000)
第2 - N + 1行:每行1个整数Li(1 <= W <= 1000)

输出描述 Output Description

输出最小的体力消耗

样例输入 Sample Input

3 3 4 5

样例输出 Sample Output

19

 

错误代码:

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<sstream>
#include<stack>
#include<fstream>
#include<list>
#include<queue>
using namespace std;
int main(){
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    priority_queue <int> q;
    int n,x,s=0,ans=0;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>x;
        q.push(x);
        s+=x;
    }
    for(int i=0;i<n-1;i++){
        ans+=s;
        s-=q.top();
        q.pop();
    }
    cout<<ans;
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

求错误点/思路


0
已采纳
Xgugugu
Xgugugu
新手守护
新手守护

可以用优先队列解决此类问题。定义一个优先队列,将每个石头重量入队,重量最小的放队首,每次取出队列队首的两个元素(取队首、出队,再取队首、出队)相加得到新的元素再入队,总共合并n-1次,将每次合并花费的力气相加求和。

我要回答