前言
正文
参考题解
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
/* 题意: 给定一段段的绳子,要求把它们串成一条绳。 每次串连的时候,是把两段绳子对折,再连接在一起。 这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。 每次串连后,原来两段绳子的长度就会减半。 思路:为了最后得到的绳子的长度最长,故越长的绳子需要在最后再折叠,因为越开始的 绳子,折叠的次数越多。故可以使用优先队列,定义绳子的越短的优先级越高 */
int main(){
priority_queue<int,vector<int>,greater<int>> q;
int n,res=0;
cin>>n;
for(int i,seg;i<n;i++){
cin>>seg;
q.push(seg);
}
while(q.size()!=1){
int a,b;
a=q.top(),q.pop();
b=q.top(),q.pop();
res=a+b>>1;
q.push(res);
}
cout<<res<<endl;
return 0;
}