编程题#6: priority queue练习题
来源: POJ (http://cxsjsx.openjudge.cn/hw2017total01/H07/)
注意: 总时间限制: 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;
//判断一个数是否为质数
//判断方法:http://blog.csdn.net/happyygdx/article/details/78660518
bool isPrimeNumber(int a){
for (int i = 2; i <= sqrt(a); i++){
if (a%i == 0)
return false;
}
return true;
}
//得到一个数的质因数数目
int getFactor(int a){
int num = 0;
int k;
for (int i = 2; i <= sqrt(a); i++){ //只循环到sqrt(a),节省时间!
if (a%i == 0){
k = a / i;
if (i != k && isPrimeNumber(k)) //相对于i的另一个因数k也有可能是质数
num++;
if (isPrimeNumber(i)) //然后判断i是否为质数
num++;
}
}
return num;
}
//函数对象,判断大小
class MyCompare{
public:
bool operator()(const int& a1, const int& a2){
int num1 = 0, num2 = 0;
num1 = getFactor(a1);
num2 = getFactor(a2);
if (num1 < num2)
return true;
else if (num1 > num2)
return false;
else if (num1 == num2)
return(a1 < a2);
}
};
int main(){
set<int, MyCompare> Myqueue;
int n, num;
cin >> n;
while (n--){
for (int i = 0; i < 10; i++){
cin >> num;
Myqueue.insert(num);
}
int min = *(Myqueue.begin());
int max = *(Myqueue.rbegin());
Myqueue.erase(min);
Myqueue.erase(max);
cout << max << ' ' << min << endl;
}
return 0;
}
课件(容器中自定义排序顺序 MyLess):