当前位置: 代码迷 >> 综合 >> 栅栏修理 Fence Repair(挑战程序设计竞赛)
  详细解决方案

栅栏修理 Fence Repair(挑战程序设计竞赛)

热度:94   发布时间:2023-12-13 05:20:22.0

我们的目标是将一块完整的木板切割成 nn 块,每块长度为 L1?,L2?,L3?...Ln?。切割后各个木块的长度总和与切割前的木板长度相等。

每次在一块木板上切一刀,代价等于该木板的长度。例如:

  • 在长度为 21 的木板切一刀,变成两块木板,长度分别为5,16,所需代价为 21
  • 在长度为 16 的木板上再切一刀,变为两块木板,长度分别为 8,8,所需代价为 16

为了达到上述目标,求最小的切割代价是多少。

输入

  • 第一行是整数 n(1≤n≤20000),表示要将原始木板切割成多少块
  • 接下来 nn 行,每行一个整数,表示最终每块小木板的长度,其中1≤Li?≤50000

输出

  • 一行,一个整数,表示达到目标所需的最小代价样例 1

输入

3
8
5
8

输出

34
#include<bits/stdc++.h>
using namespace std;int n;
priority_queue<int,vector<int>,greater<int>> q;
int main()
{while(cin>>n){for(int i=0;i<n;i++){int x;cin>>x;q.push(x);}long long sum=0;while(q.size()>1){int a=q.top();q.pop();int b=q.top();q.pop();sum+=a+b;q.push(a+b);}cout<<sum<<endl;}
}

  相关解决方案