题目:POJ - 1862
思路:每次挑选最大的两个数,进行2*sqrt(a,b)运算后放入到队列中。有点类似于之前做的fence repair题目。
这样可以保证大数被开方的次数更多,最后的结果更小。
注意:
n为1的情况,WA了几次。
学会C++输出格式控制: http://c.biancheng.net/cpp/biancheng/view/2227.html。
1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 #include <iomanip> 5 #include <algorithm> 6 7 using namespace std; 8 9 int n; 10 double w[103]; 11 12 int main() { 13 double res = 0; 14 scanf("%d", &n); 15 for (int i = 0; i < n; i++) { 16 scanf("%lf", &w[i]); 17 } 18 while (n > 0) { 19 if (n == 1) { 20 res = w[0]; 21 break; 22 } 23 24 sort(w, w + n); 25 double newW = 2 * sqrt(w[n - 1] * w[n - 2]); 26 res = newW; 27 28 w[n - 2] = newW; 29 n--; 30 } 31 32 cout << setiosflags(ios::fixed) << setprecision(3) << res << endl; 33 return 0; 34 }
POJ 1862 Stripies 题解 《挑战程序设计竞赛》
原文:http://www.cnblogs.com/carolunar/p/6388096.html