首页 > 其他 > 详细

「题解」:Smooth

时间:2019-10-23 20:41:28      阅读:77      评论:0      收藏:0      [点我收藏+]

问题 A: Smooth

时间限制: 1 Sec  内存限制: 512 MB

题面


题面谢绝公开。

题解


维护一个队列,开15个指针,对应前15个素数。

对于每一次添加数字,暴扫15个指针,将指针对应的素数与指针所在位置的元素相乘塞进队列。对应指针后移一位。

可以保证每次添加的都是当前能添加的最小元素。

复杂度……我不会证。

代码:

#include <bits/stdc++.h>
#define rint register int
#define ll long long
#define inf 0x7fffffffffffffff
using namespace std;
const int prime[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
int B,K,cnt=0,it[20];
ll ans[10000070];
int main()
{
    scanf("%d %d",&B,&K);
    ll tmp=inf,p=1;
    int pos;ans[1]=1;cnt=1;
    while(cnt<=K)
    {
        tmp=inf;
        for(rint i=1;i<=B;++i)
        {
            while(ans[it[i]]*prime[i]<=ans[cnt])it[i]++;
            p=ans[it[i]]*prime[i];
            if(p<tmp){tmp=p;pos=i;}
        }
        ans[++cnt]=tmp;
        it[pos]++;
    }
   	printf("%lld\n",ans[K]);
    return 0;
}

 

「题解」:Smooth

原文:https://www.cnblogs.com/xingmi-weiyouni/p/11728576.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!