地址 http://poj.org/problem?id=1862
题目大意是 输入最多100个数字 每次取出两个数字进行2*sqrt(m1*m2) 并将结果放回到上述数组中
重复该操作,求最后可能得到的最小结果是
输入 第一行输入一个数字N 表示下面输入N个数 接下来N行每行输入一个数字
输出 输出一个数字 即最后可能得到的最小结果
解答
因为每次计算的函数为2*sqrt(m1*m2) ,显然整数m1 m2大于等于2 就会变小
那么我们使用贪心策略 使得大的整数尽可能多次参与操作 这样的结果才会更小
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <queue> #include <vector> #include <cmath> using namespace std; /* Sample Input 3 72 30 50 Sample Output 120.000 */ const int N = 100; int n; int main() { cin >> n; priority_queue <double, vector<double>, less<double> >q; for (int i = 0; i < n; i++) { double t; cin >> t; q.push(t); } while (q.size() >= 2) { double a = q.top(); q.pop(); double b = q.top(); q.pop(); double c = 2 * sqrt(a*b); q.push(c); } printf("%.3lf ",q.top()); return 0; }