zoukankan      html  css  js  c++  java
  • AC日记——丑数 codevs 1246

    1246 丑数

     

    USACO

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
     
     
    题目描述 Description

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

    输入描述 Input Description

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

    输出描述 Output Description

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

    样例输入 Sample Input

    4 19
    2 3 5 7

    样例输出 Sample Output

    27

    数据范围及提示 Data Size & Hint
     
     
    思路:
      刚开始想用堆做结果最后一个点TLE
      现在看了别人的题解才明白还有动态规划
      认定1是第一个丑数(虽然它不是)
      然后我们从1开始往后推
      用一个now数组来记录k个质数的当前对应的dis下标
      然后我们每次更新一个推出的属于s的数
      这个s一定是当前最小的
      因为它由k个dis取出的最小
      好吧,我也说不清,看代码
     
    来,上代码:
    #include <cstdio>
    
    #define INF 0x7fffffff
    
    using namespace std;
    
    int n,k,ai[101],now[101];
    
    long long int dis[100001];
    
    int main()
    {
        scanf("%d%d",&k,&n);
        for(int i=1;i<=k;i++) scanf("%d",&ai[i]),now[i]=1;
        dis[1]=1;
        for(int i=2;i<=n+1;i++)
        {
            dis[i]=INF;
            for(int j=1;j<=k;j++)
            {
                while(ai[j]*dis[now[j]]<=dis[i-1]) now[j]++;
                if(ai[j]*dis[now[j]]<dis[i]) dis[i]=ai[j]*dis[now[j]];
            }
        }
        printf("%lld
    ",dis[n+1]);
        return 0;
    }
  • 相关阅读:
    并发与并行
    OpenCV 图像集合操作
    C++ 输出时间
    绘制模型图
    检测图像文件是否损坏
    QImage,Mat ,QByteArray转换
    图像拼接3
    图像拼接2】
    图像拼接 Stitcher
    《将博客搬至CSDN》
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6246408.html
Copyright © 2011-2022 走看看