PAT 1125 C++

1.题意

给出一串数字,代表的含义是绳子的长度。现在想要用这些绳子的结成一个更大的绳子,但是在由两个绳子结成一根绳子的时候,形成的绳子是前两根绳子一半的和。现在需要求出最长的可拼接长度。

2.分析

  • 从小到大排序
  • 求和,使用floor()函数,求出不超过结果的最大整数

3.代码

#include<cstdio> 
#include<algorithm>
#include<functional>
#include<math.h>
using namespace std;

int main(){
	int N;
	scanf("%d",&N);
	double ropeLen [N];
	for(int i = 0;i< N;i++){
		scanf("%lf",&ropeLen[i]);//input the length of rope				 
	}
	sort(ropeLen,ropeLen+N,less<double>());
		
	double res = ropeLen[0]; 
	//如果说明有两根以上的绳子 
	if(N > 1){
		res = ropeLen[0]/2 + ropeLen[1]/2;
		for(int i = 2;i < N;i++){		
			res = res/2 + ropeLen[i]/2 ;
		}		
		res = floor(res );
		printf("%.0f",res);
	}
	else{//如果只有一根绳子 
		printf("%.0f",res);	
	} 	
}

4.测试用例

8
10 15 12 3 4 13 1 15