3345:priority queue练习题
总时间限制:
2500ms
内存限制:
131072kB
描述
我们定义一个正整数a比正整数b优先的含义是:
*a的质因数数目(不包括自身)比b的质因数数目多;
*当两者质因数数目相等时,数值较大者优先级高。
现在给定一个容器,初始元素数目为0,之后每次往里面添加10个元素,每次添加之后,要求输出优先级最高与最低的元素,并把该两元素从容器中删除。
输入
第一行: num (添加元素次数,num <= 30)
下面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;
}