3345:priority queue练习题 (这是搜索的代码答案,因为我是一个小白,处看到代码时我也很多语言不是很懂,就通过搜索添加注释,希望对您有所帮助)

3345:priority queue练习题

总时间限制: 

2500ms

内存限制: 

131072kB

描述

我们定义一个正整数a比正整数b优先的含义是:
*a的质因数数目(不包括自身)比b的质因数数目多;
*当两者质因数数目相等时,数值较大者优先级高。

现在给定一个容器,初始元素数目为0,之后每次往里面添加10个元素,每次添加之后,要求输出优先级最高与最低的元素,并把该两元素从容器中删除。

输入

第一行: num (添加元素次数,num <= 30)

扫描二维码关注公众号,回复: 2200042 查看本文章

下面10*num行,每行一个正整数n(n < 10000000).

输出

每次输入10个整数后,输出容器中优先级最高与最低的元素,两者用空格间隔。

样例输入

1
10 7 66 4 5 30 91 100 8 9

样例输出

66 5

#include <iostream>
#include <cmath>
#include <set>
using namespace std;
//int isprime(int n)用于判断一个整数是否为素数,
//如果是就返回1,否则返回0。
bool isPrime(int iVal)
{
    for (int i = 2; i <= sqrt((float)iVal); i++)
    {//sqrt((float)iVal)
    //1)float(x)  x被强制类型转换为float型
    //2)sqrt(float(x)) 开平方
        if (iVal % i == 0)
            return false;
    }
    return true;
}

//得到一个数的质因数数目
int getFactor(int a)
{
    int sum = 0;
    int k = 0;
    for (int i = 2; i <= sqrt((float)a); i++)
    {
        if (a % i == 0)//即a/i = k,无余数
        {
            k = a / i;
            if (i != k && isPrime(k))
            //判断一个整数是否为素数,如果是就返回1,否则返回0 
                sum += 1;
            if (isPrime(i))
            {
                sum += 1;
            }
        }
    }
    return sum;
}

//函数对象,判断大小
class Compare_Class_Up
{
public:
    bool operator()(const int& a, const int& b)
    {//重载operator ()必须是某个类的成员函数。
      //当某个类重载了()方法,这个类就可以成为函数对象
        int sumA = 0, sumB = 0;
        sumA = getFactor(a);
        sumB = getFactor(b);
        if (sumA == sumB)
        {
            if (a < b)
            {
                return true;
            }
            else
                return false;
        }
        else if (sumA > sumB)
        {
            return false;
        }
        else
            return true;
    }
};


int main()
{
    set<int, Compare_Class_Up> queue;
    //重载operator ()必须是某个类的成员函数。
    //当某个类重载了()方法,这个类就可以成为函数对象
    int n = 0;
    cin >> n;
    while(n--)
    {
        int num;
        for (int i = 0; i < 10; i++)
        {
            cin >> num;
            queue.insert(num);
        }

        int min = *(queue.begin());
        int max = *(queue.rbegin());
        queue.erase(max);
        queue.erase(min);
        cout << max << ' ' << min << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wwwkm123/article/details/81068182