题目描述
题目大意是 输入最多100个数字 每次取出两个数字进行2*sqrt(m1*m2) 并将结果放回到上述数组中
重复该操作,求最后可能得到的最小结果是
输入 第一行输入一个数字N 表示下面输入N个数 接下来N行每行输入一个数字
输出 输出一个数字 即最后可能得到的最小结果
算法1
因为每次计算的函数为2*sqrt(m1*m2)
,显然整数m1 m2大于等于2 就会变小
那么我们使用贪心策略 使得大的整数尽可能多次参与操作 这样的结果才会更小
C++ 代码
// 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\n",q.top());
return 0;
}
好吧 最近专门找水题做.