这题说是用优先队列做,但优先队列会很麻烦,还要套用别的容器。
虽然看了题解,但也学了不少东西。比如优先队列的简化定义,set的使用和特性。
慢慢来吧。
优先队列+set:
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cmath>
#include <set>
#include <ctype.h>
#include <string.h>
using namespace std;
const int N = 20000;
const int INF = 1000000;
typedef long long LL;
const int coeff[3] = {2, 3, 5};
int main()
{
// freopen("in.txt", "r", stdin);
priority_queue <LL, vector<LL>, greater<LL> > pq;
int n;
LL a[N], num;
set <LL> s;
pq.push(1);
s.insert(1);
int i = 1;
while(i < 1510)
{
a[i] = pq.top();
pq.pop();
for(int j = 0; j < 3; j ++)
{
num = a[i] * coeff[j];
if(!s.count(num))
{
pq.push(num);
s.insert(num);
}
}
i ++;
}
while(~scanf("%d", &n) && n)
{
printf("%d\n", a[n]);
}
return 0;
}
只有set:
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <cmath>
#include <set>
#include <ctype.h>
#include <string.h>
using namespace std;
const int N = 20000;
const int INF = 1000000;
typedef long long LL;
const int coeff[3] = {2, 3, 5};
int main()
{
// freopen("in.txt", "r", stdin);
int n;
LL a[N], num;
set <LL> s;
s.insert(1);
int i = 1;
while(i < 1510)
{
a[i] = *s.begin();
s.erase(s.begin());
for(int j = 0; j < 3; j ++)
{
num = a[i] * coeff[j];
s.insert(num);
}
i ++;
}
while(~scanf("%d", &n) && n)
{
printf("%d\n", a[n]);
}
return 0;
}