PAT_甲级_1125 Chain the Ropes (25point(s))(C++)【贪心算法】
原创
©著作权归作者所有:来自51CTO博客作者再见萤火虫IT的原创作品,请联系作者获取转载授权,否则将追究法律责任
目录
1,题目描述
题目大意
2,思路
3,AC代码
4,解题过程
第一搏
第二搏
第三搏
1,题目描述
Sample Input:
Sample Output:
题目大意
将给定的几段绳子进行合并,每次将两段和为一段,并且总长度减半。求最终的最大程度。
2,思路
贪心算法
给定的节点个数,合并的次数是固定的,然而越先合并的,折半的次数越多,损失的越多,所以要把长的留在后面。
注意:向下取整可以采用将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( ̄┰ ̄*)ゞ)
所以,,,代码惨不忍睹
第二搏
欣赏了大佬的代码后才发现,这是贪心算法。。。(好吧,我承认,我和贪心算法不熟。。。)
给定的节点个数,合并的次数是固定的,然而越先合并的,损失的越多,所以要把长的留在后面。
1+2(1.5),1.5+3(2.25),2.25+4(3.125)
这样代码就很好写了,于是
#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;
}
第三搏
直觉告诉我,是精度问题,,,但是又没想到好的方法。
这里参考了这位大神的方法@TateBrwonJava【PAT甲级1125解题报告】
将double转换为int,再按int型来输出。