思路:
- 分析题目要求的就是由2,3,5,7单独相乘或者组合相乘的数字。
- 所以将数字循环起来相乘,之后结果按从大到小地无重复放进数组当中。
#include<set>
#include<queue>
#include<vector>
#include<cstdio>
using namespace std;
typedef long long ll;
int num[4]={2,3,5,7};
//set,封装了二叉树(红黑树),没有重复元素
set<ll> s;
//优先队列 :数据类型,容器类型,比较方式(这里是升序,建堆)
priority_queue<ll,vector<ll>,greater<ll> > q;
vector<ll> v;
void init(){
s.insert(1);
q.push(1);
/*由题目可知一系列数,就是2,3,5,7相乘的情况
所以程序模拟相乘就行了*/
for(int j=1;j<=5842;j++){
//可知最多是5842个
ll a=q.top();
q.pop();
v.push_back(a);//队列当中直接收
for(int i=0;i<4;i++){
ll b=a*num[i];
if(!q.count(b)){
//要保证前面没有
s.insert(b);
q.push(b);
}
}
}
}
int main(){
init();
int n;
while(scanf("%d",&n)!=EOF){
printf("%lld\n",v[n-1]);
}
return 0;
}
标签:set,int,long,Zcmu,相乘,1178,include
From: https://www.cnblogs.com/hai-zei/p/18228776