1070 结绳 (25 point(s))
Posted Atl212
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1070 结绳 (25 point(s))相关的知识,希望对你有一定的参考价值。
#include <bits/stdc++.h>
using namespace std;
int main() {
double n, sum = 0, tmp;
vector<double> robe;
cin >> n;
for(int i = 0; i < n; i++){
cin >> tmp;
robe.push_back(tmp);
}
sort(begin(robe), end(robe));
sum = robe[0];
for(int i = 1; i < n ; i++)
sum = sum / 2 + robe[i] / 2;
cout << (int) sum;
}
思路有点问题,没想出来这是贪心或者哈夫曼树。
最开始把思维禁锢到 int 了,没想到 double 浮点类型。所以在草稿上面演算的时候有问题。算不出样例的输出 14 ,所以就去看别人的代码了。
不过就算想出 double 也还是解不了,因为不知道要排序后再相加。虽然当时根据前面的某个题目 爱丁顿数 学过,要对这种列出序列的数据进行排序,但是草稿演算的时候缺的思路太多,感觉对题目理解也有问题,而且演算也花了不少时间,就没有继续想下去。
但这次比前面有进步,至少懂得尝试在草稿上进行具体演算了,如果不行直接就做下一题或者参考别人的文章。而不是对题目条件,或者处理方法浮光掠影。
刚开始参考某些人的时候以为自己思路错了,因为我是这样理解题目的 “每次串连后,原来两段绳子的长度就会减半” 或者 “把两段绳子对折” 这两个描述,理解是分别把原来的绳子取半后相加。
但是看代码都是 tmp = (tmp + v[i]) / 2 这种 整型相加后再取半,有点无法理解,还以为自己看错题目了。然后看到这份代码后发现确实有相同思路的,并且也可以全部AC,证明分别取半再相加是没有问题的,只不过要定义为浮点类型。
不过如果是浮点数相加后再取半,结果应该也是一样的。但是为什么能够用 int 整型计算就不是很了解了。这样不会在运算中多次取整导致结果不一致?
别人实现的方法不太一样,这里给出的是用一个 sum 累积每个元素的和,参考里面是将和存在数组里面,并和后面的元素相加运算。用 sum 要初始化为第一个元素,而参考的方法就不需要。因为是通过下标减一 i - 1 来遍历首位元素的。
以上是关于1070 结绳 (25 point(s))的主要内容,如果未能解决你的问题,请参考以下文章