题目描述
分析
刚开始都没太懂题目的意思…
绳子每次打结长度都会减小到原来的一半,那么打结的顺序会影响到最终的长度。我们先来看3段绳子的例子:
3段长度分别为a,b,c,那么总长为((a+b)/2+c)/2=a/4+b/2+c/2。由于c的权重最大,那么总长会主要取决于c的长度。为了使总长最大,将c段设置为3段中最长的一段即可,即最长的一段最后打结。推导到任意段绳子都是如此,所以按从小到大的顺序打结即可。
矛盾之处
题目要求四舍五入,那么理应用浮点型数据,可是这样最后一个测试点无法通过…
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n; cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) scanf("%d", &v[i]);
sort(v.begin(), v.end());
double len = v[0];
for (int i = 1; i < n; i++) {
len = (len + v[i]) / 2;
}
printf("%d", (int)round(len));
return 0;
}
于是改为int型数据就可以了…我觉得这是题目的一个矛盾之处。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n; cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) scanf("%d", &v[i]);
sort(v.begin(), v.end());
int len = v[0];
for (int i = 1; i < n; i++) {
len = (len + v[i]) / 2;
}
printf("%d", len);
return 0;
}