目录

​1,题目描述​

​题目大意​

​2,思路​

​3,AC代码​

​4,解题过程​

​第一搏​

​第二搏​

​第三搏​


1,题目描述

PAT_甲级_1125 Chain the Ropes (25point(s))(C++)【贪心算法】_PAT

Sample Input:

8
10 15 12 3 4 13 1 15

 

Sample Output:

14

题目大意

将给定的几段绳子进行合并,每次将两段和为一段,并且总长度减半。求最终的最大程度。

 

2,思路

贪心算法

给定的节点个数,合并的次数是固定的,然而越先合并的,折半的次数越多,损失的越多,所以要把长的留在后面。

PAT_甲级_1125 Chain the Ropes (25point(s))(C++)【贪心算法】_测试点4 贪心算法_02

注意:向下取整可以采用将double转换为int,然后按整型输出。

 

3,AC代码

#include<bits/stdc++.h>
using namespace std;

int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
int N;
cin>>N;
vector<int> data(N);
for(int i = 0; i < N; i++){
scanf("%d", &data[i]);
}
sort(data.begin(), data.end());
double sum = data[0];
for(int i = 1; i < N; i++){
sum = (sum + data[i]) / 2;
}
int ans = sum;
printf("%d", ans);
return 0;
}

4,解题过程

第一搏

找了半天规律,到最后还是错的。。。

以1 2 3 4合并顺序为例,一开始想的是:

1+2(1.5),3+4(3.5),然后1.5+3.5(2.5),结果最好(中庸之道。。。好吧,其实只是感觉而已o( ̄┰ ̄*)ゞ)

PAT_甲级_1125 Chain the Ropes (25point(s))(C++)【贪心算法】_1125_03

所以,,,代码惨不忍睹

 

第二搏

欣赏了大佬的代码后才发现,这是贪心算法。。。(好吧,我承认,我和贪心算法不熟。。。)

给定的节点个数,合并的次数是固定的,然而越先合并的,损失的越多,所以要把长的留在后面。

1+2(1.5),1.5+3(2.25),2.25+4(3.125)

PAT_甲级_1125 Chain the Ropes (25point(s))(C++)【贪心算法】_C++_04

这样代码就很好写了,于是

#include<bits/stdc++.h>
using namespace std;

int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
int N;
cin>>N;
vector<int> data(N);
for(int i = 0; i < N; i++){
scanf("%d", &data[i]);
}
sort(data.begin(), data.end());
double sum = data[0];
for(int i = 1; i < N; i++){
sum = (sum + data[i]) / 2;
}
printf("%.0f", sum);
return 0;
}

PAT_甲级_1125 Chain the Ropes (25point(s))(C++)【贪心算法】_测试点4 贪心算法_05

第三搏

直觉告诉我,是精度问题,,,但是又没想到好的方法。

这里参考了这位大神的方法​​@TateBrwonJava【PAT甲级1125解题报告】​

将double转换为int,再按int型来输出。

PAT_甲级_1125 Chain the Ropes (25point(s))(C++)【贪心算法】_PAT_06

PAT_甲级_1125 Chain the Ropes (25point(s))(C++)【贪心算法】_测试点4 贪心算法_07