1125 Chain the Ropes (25分)/数学分析/排序

题目描述

在这里插入图片描述在这里插入图片描述

分析

刚开始都没太懂题目的意思…
  绳子每次打结长度都会减小到原来的一半,那么打结的顺序会影响到最终的长度。我们先来看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;
}
发布了103 篇原创文章 · 获赞 9 · 访问量 4719

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104327845