思路
每次选取最短的两根结绳,初始用sort对所有绳段长度由小到大排序,第一次选取a[0]和a[1]的绳段结绳,并将新绳段存储在a[1],a[1]=(a[0]+a[1])/2,已知初始时a[0]<a[2],a[1]<a[2],有(a[0]+a[1])/2<a[2],故此时的a[1]和a[2]中的绳段是当前绳段中最短的两根,依此类推。
代码
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n;
cin>>n;
double a[n];
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
for(int i=0;i<n-1;i++){
a[i+1]=(a[i]+a[i+1])/2;
}
printf("%d",(int)a[n-1]);
return 0;
}