poj 1862 2*根号(n1*n2)问题 贪心算法
题意: 有n个数,要把其中2个数进行2*根号(n1*n2)操作,求剩下最小的那个数是多少?
哭诉:看题目根本没看出来要让我做这个操作。
思路:
- 每次把最大的,次大的拿出来进行操作
- 用"优先队列"巧解,优先队列中剩下的那个就是题目要求求的答案。
解题代码:
#include <iostream> #include <math.h> #include <algorithm> #include <queue> #include <cstdio> using namespace std; int main() { priority_queue<double> pq; int n; scanf("%d", &n); for (int i = 0; i < n; i++) { int x; scanf("%d", &x); pq.push(x); } while (pq.size() != 1) { double m = pq.top(); pq.pop(); double n = pq.top(); pq.pop(); pq.push(2 * sqrt(m*n)); } printf("%.3f\n", pq.top()); return 0; }
君子知命不惧,自当日日自新