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;
}
求错误点/思路