題目描述
分析
剛開始都沒太懂題目的意思…
繩子每次打結長度都會減小到原來的一半,那麼打結的順序會影響到最終的長度。我們先來看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;
}