poj 1862 2*根号(n1*n2)问题 贪心算法

题意: 有n个数,要把其中2个数进行2*根号(n1*n2)操作,求剩下最小的那个数是多少?

哭诉:看题目根本没看出来要让我做这个操作。

思路:

  1. 每次把最大的,次大的拿出来进行操作
  2. 用"优先队列"巧解,优先队列中剩下的那个就是题目要求求的答案。

解题代码:

#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;
}

 

posted @ 2018-08-01 14:31  徐小晋  阅读(163)  评论(0编辑  收藏  举报