week8_1

1.问题分析

题目要求①输入n组数据,每组数据有十个②找出所有数据中优先级最高和最低的值③优先级定义:P(a)>P(b),a的质因子数目大于b,质因子数目相同,数值大的优先级高。

先写一个Factor()函数用于查找数字的质因子个数,需要注意的是,质因子不包括数值本身,比如3的质因子个数是0,不是1。

在主函数中,我用的是map<int,vector<int> >容器,键——质因子数目,值——对应的数字,vector没有排序功能,所以要自己排序。比较费劲的是,没办法直接对map容器里的vector进行删除,添加,排序的操作,只能用tem来暂存,然后完全覆盖,这样做效率比较低。不过代码量和用multiset容器几乎相同。

2.解决方案

①Factor()函数,查找质因子数目

②主函数中先判断map中是否存在对应的值,不存在的话,需要先弄一个tem存进一个值,再插进去。存在的话,需要弄出值对应的数组,再插进数去。

③找出Map[begin]中的最小数,和Map[end-1]中的最大数。存在re[2]中,在数组中删除再放回Map容器。

3.算法设计

4.编程实现

 

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int Factor(int num)
{
        int i=2,re=0,tem=0;
        int n=num;
        while(n>=i)
        {
                if(n%i==0)
                {
                        tem=i;
                        re++;
                        n/=i;
                        while(n%i==0)
                                n/=i;
                }
                else
                        i++;
        }
        if(tem==num)re--;
        return re;
}
int main()
{
        int num,count,factor,n,re[2];
        map<int,vector<int> > Map;
        map<int,vector<int> >::iterator it;
        cin>>num;
        while(num--)
        {
                count=10;
                while(count--)
                {
                        cin>>n;
                        factor=Factor(n);
                        it=Map.find(factor);
                        if(it==Map.end())
                        {
                                vector<int> tem;
                                tem.push_back(n);
                                Map[factor]=tem;
                        }
                        else
                        {
                        vector<int> tem;
                        tem=it->second;
                        tem.push_back(n);
                        sort(tem.begin(),tem.end());
                        Map[factor]=tem;
                        }
                }
                vector<int>tem;
                it=Map.begin();
                tem=it->second;
                re[0]=tem[0];
                tem.erase(tem.begin());
                Map[0]=tem;
                it=Map.end();
                it--;
                n=it->first;
                tem=it->second;
                int len=tem.size()-1;
                re[1]=tem[len];
                tem.pop_back();
                Map[n]=tem;
                cout<<re[1]<<" "<<re[0]<<endl;
        }
        return 0;
}

5.结果分析

完美,O(∩_∩)O哈哈哈~

6.总结体会

万幸学校的测试数据不会上千,要不然这么奢侈的代码肯定超时了,O(∩_∩)O哈哈~。不过,抱有这种思想的我,估计这辈子最多是个码农了,阔怕……

posted @ 2018-05-01 19:38  vlice  阅读(116)  评论(0编辑  收藏  举报