標籤:blog http io ar sp 2014 on log amp
題意:問第n(n <= 1500)小的醜數(質因數只有2或3或5)是幾。
題目連結:http://poj.org/problem?id=1338
——>>1, 2, 3, 4, 5, 6, 8, ...
假設小根堆存以上醜數,那麼每次取出最小的數,這個最小的數nMin,它可以產生三個數:nMin * 2, nMin * 3, nMin * 5,將這三個數放入小根堆繼續,一直複篩出1500個醜數為止。
小根堆可用優先隊列來替代。
#include <cstdio>#include <queue>#include <vector>using std::priority_queue;using std::vector;using std::greater;const int MAXN = 1500;long long nRet[MAXN];void GetUglyNumbers(){ int nCnt = 0; priority_queue<long long, vector<long long>, greater<long long> > pq; pq.push(1); while (nCnt < MAXN) { long long nMin = pq.top(); pq.pop(); if (nRet[nCnt] != nMin) { nRet[++nCnt] = nMin; pq.push(nMin * 2); pq.push(nMin * 3); pq.push(nMin * 5); } }}int main(){ int n; GetUglyNumbers(); while (scanf("%d", &n) == 1 && n) { printf("%I64d\n", nRet[n]); } return 0;}
poj - 1338 - Ugly Numbers(優先隊列)