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;
    }
  • 相关阅读:
    Angular Universal 学习笔记
    SAP Spartacus 如何获得当前渲染页面的 CMS 元数据
    Angular 服务器端渲染的学习笔记(二)
    Angular 服务器端渲染的学习笔记(一)
    第三方外部 Saas提供商如何跟使用 SAP 系统的客户进行对接接口集成
    如何从 SAP Spartacus Product Detail 页面,找到其 Angular 实现 Component 的位置
    具备自动刷新功能的 SAP ABAP ALV 报表
    C++学习目录
    c--条件编译
    c--文件读写--二进制
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6246408.html
Copyright © 2011-2022 走看看