zoukankan      html  css  js  c++  java
  • [jobdu]丑数

    由于思维的惯性,用了queue。后来发现一要注意要用集合判重,二是每次往queue里放的多,后来溢出了,要用long long。但这样要用数组,集合,队列,内存多。效率是O(n*logn)的。

    #include <iostream>
    #include <algorithm>
    #include <memory.h>
    #include <vector>
    #include <queue>
    #include <set>
    #include <functional>
    #define LEN 1505
    #define ulong unsigned long long
    using namespace std;
     
    ulong dp[LEN];
     
    int main()
    {
        priority_queue<ulong, vector<ulong>, greater<ulong> > que;
        set<ulong> visit;
        que.push(1);
        visit.insert(1);
        int i = 0;
        while (i < LEN) {
            i++;
            int node = que.top();
            que.pop();
            dp[i] = node;
            if (visit.count(node*2) == 0) {
                que.push(node*2);
                visit.insert(node*2);
            }
            if (visit.count(node*3) == 0) {
                que.push(node*3);
                visit.insert(node*3);
            }
            if (visit.count(node*5) == 0) {
                que.push(node*5);
                visit.insert(node*5);
            }
        }
        int n;
        while (cin >> n) {
            cout << dp[n] << endl;
        }
    }
    

     另有效率O(n),空间O(1)的方法。因为本质上是已有的丑数*2,*3,*5的结果在竞争,那么每次记录*2,*3,*5的丑数的编号(用数组记录已经生成的丑数),然后比较产生最小的,就是下一个丑数。

    http://blog.csdn.net/acm_zl/article/details/10613073

    #include <iostream>
    #include <memory.h>
    #define MIN(a,b) a<b?a:b
    #define LEN 1505
    #define ulong unsigned long long
    using namespace std;
     
    ulong ugly[LEN];
    
    int main()
    {
        memset(ugly, 0, sizeof(ugly));
        ugly[1] = 1;
        int index2 = 1;
        int index3 = 1;
        int index5 = 1;
        for (int i = 2; i < LEN; i++)
        {
            ulong m2 = 2 * ugly[index2];
            ulong m3 = 3 * ugly[index3];
            ulong m5 = 5 * ugly[index5];
            int tmp = MIN(m2, m3);
            ulong m = MIN(tmp, m5);
            ugly[i] = m;
            if (m == m2) index2++;
            if (m == m3) index3++;
            if (m == m5) index5++;
        }
        
        int n;
        while (cin >> n) {
            cout << ugly[n] << endl;
        }
    }
    

      

  • 相关阅读:
    台州 OJ 3847 Mowing the Lawn 线性DP 单调队列
    洛谷 OJ P1417 烹调方案 01背包
    快速幂取模
    台州 OJ 2649 More is better 并查集
    UVa 1640
    UVa 11971
    UVa 10900
    UVa 11346
    UVa 10288
    UVa 1639
  • 原文地址:https://www.cnblogs.com/lautsie/p/3400526.html
Copyright © 2011-2022 走看看