题目大意
给定一些绳段,您应该将它们链接成一根绳子。每次只能将两段折叠成环,然后将它们链接成一块,如图所示。由此产生的链条将被视为另一段绳索,可以再次折叠。每次链接后,原始两段的长度将减半。
解题分析
- 每次连结原来的绳子都要分别减半,因此首先链接短的
- 因此想到优先队列,每次取最小的两个进行操作,并将结果压回
代码
#include<bits/stdc++.h>
using namespace std;
priority_queue<int, vector<int>, greater<int> > que;
int main() {
int n;
cin >> n;
int tem;
for (int i = 0; i < n; i++) {
cin >> tem;
que.push(tem);
}
while (que.size() != 1) {
int a = que.top();
que.pop();
int b = que.top();
que.pop();
que.push((a + b) / 2);
}
cout << que.top() << endl;
return 0;
}