一、题目概述
两根绳索可以连接成一根绳索,新绳索的长度是原两根绳索的一半。
依据给定N条绳索的长度,求出可以获得的最大绳索长度(长度向下取整)。
二、思路
基于贪心策略或哈夫曼树策略。将N条绳索链接为一根,链接的次数固定,且每次连接损失参与链接的两根绳索长度的一半。则每次连接损失的长度最少,可以得到最长绳索。
对绳索按长度升序参与链接即可。
注意:使用浮点型保存结果,输出时截断小数部分。
三、代码
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N;
scanf("%d", &N);
vector<double> rope(N);
for( int i = 0; i < N; ++i )
scanf("%lf", &rope[i]);
sort(rope.begin(), rope.end());
for( int i = 1; i < N; ++i )
rope[i] = (rope[i - 1] + rope[i]) / 2;
printf("%d", (int)rope[N - 1]);
}