丑数之优先队列心得

标题:第几个幸运数

到x星球旅行的游客都被发给一个整数,作为游客编号。
x星的国王有个怪癖,他只喜欢数字3,5和7。
国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。

我们来看前10个幸运数字是:
3 5 7 9 15 21 25 27 35 45
因而第11个幸运数字是:49

小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。

请你帮小明计算一下,59084709587505是第几个幸运数字。

需要提交的是一个整数,请不要填写任何多余内容。
--------------------- 
作者:krypton12138 
来源:CSDN 
原文:https://blog.csdn.net/krypton12138/article/details/79801924 
版权声明:本文为博主原创文章,转载请附上博文链接!

#include <bits/stdc++.h>
using namespace std;
const int a[] = {3,5,7};
const long long maxn = 59084709587505;
priority_queue<long long,vector<long long>,greater<long long> >p;
set<long long>s;
int res;
int main(){
    long long n,m;
    for(int i = 0;i < 3;i++)p.push(a[i]);
    while((n = p.top())<=maxn){
        p.pop();
        res++;
        for(int i = 0;i < 3;i++){
            m = n*a[i];
            if(!s.count(m)){
                s.insert(m);
                p.push(m);
            }
        }    
    }
    cout << res;
    return 0;
}
--------------------- 
 

上题为转载的大牛的题目,2018年的蓝桥杯我也参加了,可惜是B组,19年报A组试下,看到这个题,有所感想。

题目中的幸运数字足够大,但都是通过数组a[]={3,5,7}进行相乘得到。通过看大牛的代码,知道应该用队列来存放每次得到的结果,每次从队列中取出第一个元素,判断其是否与所找的那个数相等,若不相等,就会用n保存与数组a[]中的3,5,7分别相乘,得到m。

这里用到了一个set,网上查了一下:要用set存储,s.count()就是查找是否存在的函数。因此只要用s.count(m)查下之前是否有过m,若没有,则插入到s中,并且添加到队列中。

结果在手算前几项时,会发现,这种用一般队列的方法当存储到n=5时 5x3=15(不入队列),5x5=25(入队)5x7=35也入队,但是此时会有中间的25还没有入队时,35就已经入队,这是不符合情况的。因此本题大牛才用到了优先队列

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

上网查了下优先队列的定义方法:

说到队列,我们首先想到就是先进先出,后进后出;那么何为优先队列呢,在优先队列中,元素被赋予优先级,当访问元素时,具有最高级优先级的元素先被访问。即优先队列具有最高级先出的行为特征。

优先队列在头文件#include <queue>中;

其声明格式为:priority_queue <int> ans;//声明一个名为ans的整形的优先队列
但此声明方法只能在默认的优先队列中,优先级最高的先出队。默认的int类型的优先队列中先出队的为队列中较大的数。而此题

应该是每次出队的应该为最小的。所以本题大牛才用到了自定义的优先队列

priority_queue<long long,vector<long long>,greater<long long> >p;

下面链接为优先队列的定义,以及介绍,想了解下的老铁可以看看。
原文:https://blog.csdn.net/ac_gibson/article/details/44200411 

//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)
 

本人也是小垃圾,不喜勿喷。仅作为自己心得和笔记。加油!
 

发布了24 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xindada559/article/details/88757679