测试地址:☞
Given some segments of rope, you are supposed to chain them into one rope. Each time you may only fold two segments into loops and chain them into one piece, as shown by the figure. The resulting chain will be treated as another segment of rope and can be folded again. After each chaining, the lengths of the original two segments will be halved.
Your job is to make the longest possible rope out of N given segments.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (2≤N≤104). Then N positive integer lengths of the segments are given in the next line, separated by spaces. All the integers are no more than 104.
Output Specification:
For each case, print in a line the length of the longest possible rope that can be made by the given segments. The result must be rounded to the nearest integer that is no greater than the maximum length.
Sample Input:
8
10 15 12 3 4 13 1 15
Sample Output:
14
【题意】
给出 n 个绳子的长度,要求将这 n 条绳子连接成一条,求可以连成的最大长度,每两条绳子连接,都要各自减半,连接好的两条绳又被当成另一段绳子与其他绳子连接
【思路】
每两条绳子连接,长度每次都要减半,那么我们就应该使较长的绳子减半的次数尽可能少,可以发现,越先连接的绳子减半的次数越多,所以我们把长的绳子放到最后连接,即将绳子长度从小到大排序,依次连接就可以得到一条最长的绳子。
【AC代码】
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
int n, minn;
cin >> n;
vector<int> v(n);
for(int i = 0; i < n; i++)
cin >> v[i];
sort(v.begin(), v.end());
minn = v[0];
for(int i = 1; i < n; i++){
minn = (minn+v[i])/2;
}
cout << minn;
return 0;
}