【蓝桥杯】 2018初赛 第几个幸运数/优先队列

题目描述

到x星球旅行的游客都被发给一个整数,作为游客编号。
x星的国王有个怪癖,他只喜欢数字3,5和7。
国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。
前10个幸运数字是:3 5 7 9 15 21 25 27 35 45,因而第11个幸运数字是:49
小明领到了一个幸运数字 59084709587505。
去领奖的时候,人家要求他准确说出这是第几个幸运数字,否则领不到奖品。
请你帮小明计算一下,59084709587505是第几个幸运数字。

输出

输出一个整数表示答案

【思路】
1.正解:建一个从小到大取数的优先队列(priority_queuepriority_queue<数据类型,vector<数据类型>,greater<数据类型>>),每次去出队列中最小的,分别去乘3,5,7,然后判断是否重复(可以用map或者set),不重复就丢进队列中,知道去出的数字是我们要求的,输出取了多少次即可。

【补充】
1.优先队列用法:
声明:priority_queue<数据类型>;从大到小
priority_queuepriority_queue<数据类型,vector<数据类型>,greater<数据类型>>;从小到大
empty()    如果队列为空,则返回真
pop()    删除对顶元素,删除第一个元素
push()    加入一个元素
size()     返回优先队列中拥有的元素个数
top()     返回优先队列对顶元素,返回优先队列中有最高优先级的元素
2.map 和 set
(1)map的节点是一对数据,使用关键值Key来唯一标识每一个成员 map可以重复。是经过排序了的二元组的集合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的)是在排序或搜索时使用,它的值可以在容器中重新获取;而 另一个值是该元素关联的数值。
map<type1, type2> mymap;
(2)set的节点是一个数据,set是集合。含了经过排序了的数据,这些数据的值(value)必须是唯一的。
set<数据类型> myset;
【set常用函数】
begin()    ,返回set容器的第一个迭代器
end()      ,返回set容器的最后一个迭代器
clear()    ,删除set容器中的所有的元素
empty()    ,判断set容器是否为空
max_size()   ,返回set容器可能包含的元素最大个数
size()      ,返回当前set容器中的元素个数
rbegin     ,返回的值和end()相同
rend()     ,返回的值和rbegin()相同

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
typedef priority_queue<ll,vector<ll>,greater<ll> > pq;
typedef map<ll,int> mp;
mp vis;
int sum[5]={3,5,7};
int main()
{
   ll tem=59084709587505;

    pq qu;
    qu.push(1);
    int ans=0;
    while(1)
    {
        ll cnt=qu.top();
        qu.pop();
        if(cnt==tem)
        {
           cout<<ans<<endl;
           break;
        }
        ll temcnt;
        for(int i=0;i<3;i++)
        {
            temcnt=cnt*sum[i];
            if(vis[temcnt]==0)
            {
                qu.push(temcnt);
                vis[temcnt]=1;
            }
        }
        ans++;
    }
}

answer:1905

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值