题目描述
到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