• 丑数[数据加强版]


    丑数[数据加强版]

    Description

    对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合。 这个集合包括:p1, p1p2, p1p1, 和 p1p2p3 (还有其它)。这是个对于一个输入的S的丑数集 合。注意:我们不认为1 是一个丑数。 你的工作是对于输入的集合S去寻找集合中的第N个丑数。long long对于 程序是足够的。

    Input

    第 1 行: 二个被空隔分开的整数:K 和 N , 1<= K<=100 , 1<= N<=3,000,000. 第 2 行: K 个被空隔分开的整数:集合S的元素

    Output

    单独的一行,写上对于输入的S的第N个丑数。

    Sample Input

    4 19
    2 3 5 7
    

    Sample Output

    27
    

    HINT

    Source

    //
    //  f.cpp
    //  noip
    //
    //  Created by lijian3256 on 2020/1/11.
    //  Copyright © 2020 lijian3256. All rights reserved.
    //
     
    #include<bits/stdc++.h>
    using namespace std;
      
    const int maxcount = 3000001;
    long long r[maxcount];
      
    int heap[101];
    int heapsize = 0;
      
    void put(int n)
    {
        heap[heapsize + 1] = n;
        heapsize ++;
        int now = heapsize;
        while(now > 1)
        {
            int parent = now >> 1;
            if(heap[parent] <= heap[now])
            {
                return;
            }
            else
            {
                swap(heap[parent], heap[now]);
                now = parent;
            }
        }
    }
      
    int get()
    {
        if(heapsize < 1)
            {
                cout << "error";
                return -1;
            }
        int r = heap[1];
          
        heap[1] = heap[heapsize];
        heapsize--;
        int now = 1;
          
        while(now*2 <= heapsize)
        {
            int son1 = now * 2;
            int son2 = son1 + 1;
            int smallerson = son1;
            if(son2 <= heapsize)
            {
                if(heap[son1] > heap[son2])
                {
                    smallerson = son2;
                }
                else
                    smallerson = son1;
            }
              
            if(heap[smallerson] < heap[now])
            {
                swap(heap[smallerson], heap[now]);
                now = smallerson;
            }
            else
            {
                return r;
            }
        }
        return r;
    }
      
      
    struct T
    {
        long long n;
        int i;
        int j;
    };
    T  heap2[101];
    int heapsize2 = 0;
      
    int find(long long n, int start, int end)
    {
        if (start == end)
        {
            if(heap2[start].n == n)
                return -1;
            else if(heap2[start].n > n)
                return start+1;
            else
                return start;
        }
        int m = (start + end) / 2;
        if(heap2[m].n == n)
            return -1;
        else if(heap2[m].n > n)
        {
            if(m + 1 > end)
                return m+1;
            else
                return find(n, m + 1, end);
        }
        else
        {
            if(start > m-1)
                return start;
            else
                return find(n, start, m - 1);
        }
    }
      
    bool put2(long long n, int i, int j)
    {
        int k;
        if(heapsize2 < 1)
            k = 1;
        else
            k = find(n, 1, heapsize2);
        if ( k == -1)
            return false;
        else
        {
            T node;
            node.n = n;
            node.i = i;
            node.j = j;
            for(int c=heapsize2;c>=k;c--)
                heap2[c+1] = heap2[c];
            heap2[k] = node;
            heapsize2++;
            return true;
        }
    }
      
      
      
    T get2()
    {
        return heap2[heapsize2--];
          
    }
      
    int main()
    {
        int P[101];
        int K, N;
        int temp;
        cin >> K >> N;
        for(int i=1;i<=K;i++)
        {
            cin >> temp;
            put(temp);
        }
          
        for(int i=1;i<=K;i++)
            P[i] = get();
          
          
        for(int i=1;i<=K;i++)
        {
            put2(P[i], P[i], 0);
        }
          
      
        int nn = 0;
      
        while(nn <= N)
        {
            T t = get2();
            if(t.n > r[nn])
            {
                r[++nn] = t.n;
            }
              
            int j = t.j + 1;
            while(! put2(t.i * r[j], t.i, j))
            {
                j++;
            }
        }
          
        cout << r[N];
        //cout << pp << " " << r[N] << " " << N;
        return 0;
    }
     
    /**************************************************************
        Problem: 1499
        User: LJA001162
        Language: C++
        Result: 正确
        Time:1568 ms
        Memory:24980 kb
    ****************************************************************/
    
  • 相关阅读:
    Log4net使用指南[转]
    SQL 数据库全库检索
    10款屏幕取色器/颜色拾取工具软件介绍及下载地址[转]
    字符串加密解密函数 (C#) (转)
    C# 读写文本文件乱码解决方案
    C# tips 设置文本框光标的位置[转]
    如何显示数据库中的试题和图形[转]
    [转帖]C#执行SQL脚本,读取XML文件
    使用AnimateWindow API函数实现动画窗体
    雨林木风 Ylmf Linux Y1.5(Ubuntu 9.10)正式发布[转]
  • 原文地址:https://www.cnblogs.com/LJA001162/p/12079331.html
Copyright © 2020-2023  润新知