C++ 编程题练习-priority queue练习题(9-6)

来源:互联网 发布:2016零售业数据 编辑:程序博客网 时间:2024/06/06 08:47

C++ 编程题练习-priority queue练习题

来源:coursera c++ pku 第9周编程作业

一、题目

描述

我们定义一个正整数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

二、程序

这道题可以使用priority_queue,也可以使用set,但用priority_queue时要去除最大最小的两个数,并把它们删除会有点麻烦,因此这里使用set。

#include <iostream>#include <queue>#include <set>#include <cmath>using namespace std;struct Node{    int num;    int fac;    Node(int n=0, int f=0):num(n), fac(f) { }}; bool operator < (Node a, Node b){    if(a.fac == b.fac) return a.num<b.num;    return a.fac<b.fac;}//int getFacs(const int num);//class Comp//{//  public://      bool operator()(const int & a, const int & b){//          int fac1, fac2;//          fac1 = getFacs(a);//          fac2 = getFacs(b);//          if(fac1==fac2) return a<b;//          else return fac1<fac2;//      }//};bool isPrime(int n){    for(int i=2; i<=sqrt(n); i++)        if(n%i==0) return false;    return true;}int getFacs(const int num){    int fac=0;    int temp = num;    int k = 0;    for(int j=2; j<=sqrt(temp); j++){        if(temp%j==0){            if(isPrime(j)) fac++;            k = temp/j;            if(j!=k && isPrime(k)) fac++;        }    }    return fac;}int main(){    set<Node> q;    //也可以存储int类型,并自行定义大小关系 //  set<int, Comp> q;    int n;    cin>>n;    while(n--){        for(int i=0; i<10; i++){            int num;            cin>>num;            int fac = getFacs(num);            q.insert(Node(num, fac));        }        Node min = *(q.begin());        Node max = *(q.rbegin());        //题目要求把这两个元素从容器中删除        q.erase(max);        q.erase(min);        set<Node>::iterator i;        for(i=q.begin(); i!=q.end(); i++){            cout<<(*i).num<<endl;        }        cout<<max.num<<" "<<min.num<<endl;    }    return 0;}
0 0