将一块拉面切成 N 段,每段的长度分别为 L1 ,L2 ,…,LN 个长度单位。切割长度为x的拉面花费x单位时间。若拉面原长为 12 ,先将 12 切成 3+9 ,花费 12 单位时间,再将 9 切成 4+5 ,花费 9 单位时间,一共花费 21 单位时间;还可以先将 12 切成 4+8 ,花费 12 单位时间,再将 8 切成 3+5 ,花费 8 单位时间,一共花费 20 单位时间。后者比前者更省时间。至少要花费多少时间才能切完这条拉面呢?
输入格式:第一行为一个整数N,在接下来的 N 行中,每行为一个整数 Li。输出格式:一个整数,表示最少要花费的时间(即最短的拉面)
#include <bits/stdc++.h>
using namespace std;
int main(){//最小堆,堆顶top为最小值
int n;cin>>n;priority_queue<int,vector<int>,greater<int>> q;
for(int i=0;i<n;i++){
int li;cin>>li;q.push(li);
}int sum=0;
while(q.size()>=2){//每次合并最小的两段
int add=q.top();q.pop();add+=q.top();q.pop();
sum+=add;q.push(add);
}cout<<sum;return 0;
}
输入示例:4 \n 3 \n 5 \n 7 \n 11 输出示例:49
990

被折叠的 条评论
为什么被折叠?



