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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章