题意
给定N个绳子,两段绳子可合并为原来总长度一半的新绳,求将N个绳合并,可得到的最大长度。
题解
以三根绳子为例,长度分别为a,b,c
首先合并a,b ,可得到长度
1
2
(
1
2
(
a
+
b
)
+
c
)
\frac{1}{2}(\frac{1}{2}(a+b)+c)
21(21(a+b)+c)
显然
1
4
\frac{1}{4}
41的部分对总长度影响更小,这启示我们应该首先合并最短的两段绳(类似哈夫曼树的思想)
源码
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int arr[10004];
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
sort(arr,arr+n);
double x=arr[0];
for(int i=1;i<n;i++){
x=1.0*(x+arr[i])/2;
}
cout<<(int)x<<endl;
return 0;
}