结绳
给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。
给定 N 段绳子的长度,你需要找出它们能串成的绳子的最大长度。
输入格式:
每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 N (2≤N≤104);第 2 行给出 N 个正整数,即原始绳段的长度,数字间以空格分隔。所有整数都不超过104。
输出格式:
在一行中输出能够串成的绳子的最大长度。结果向下取整,即取为不超过最大长度的最近整数。
输入样例:
8 10 15 12 3 4 13 1 15
输出样例:
14
思路解析:
看到这道题,让你输出能够串成的绳子的最大长度。那必定是有多个答案,但是我要输出最长的,所以我们优先考虑是不是按某一个顺序来打结,才能达到最大。这里很容易想到的就是从小到大或者从大到小。经过数学分析和计算,我们得出从小打到就能得到最长。
所以这题的难点就是排序。
这里我采用了冒泡排序,首先是因为冒泡排序代码简单,恰好这道题也不会超时。
int BubbleSort(int a[],int n){
for(int i=0;i<n-1;i++){
for(int j=n-1;j>i;j--){
if(a[j-1]>a[j]){
int temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
return a[n];
}
//他的调用:
BubbleSort(num,n);
//num为num[]数组
然后通过for循环来求sum值。但是这里要特别注意噢,别出错了。 我最开始就是在这里出错了。
代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
int BubbleSort(int a[],int n){
for(int i=0;i<n-1;i++){
for(int j=n-1;j>i;j--){
if(a[j-1]>a[j]){
int temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
return a[n];
}
int main(){
int n;
scanf("%d",&n);
int num[n];
double sum=0;
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
BubbleSort(num,n);
// for(int i=0;i<n;i++){
// printf("%d ",num[i]);
// }
sum=num[0];
for(int i=0;i<n;i++){
sum=(sum+num[i])/2.0;
// if(i==1) sum=sum+(num[0]+num[1])/2;
// else{
// sum/=2;
// sum+=num[i]/2;
// }//这是最开始出错的代码,输出结果是13;
}
printf("%d",(int)sum);
}