给定一个整数列表,如何找到不分割其中任何一个的最小整数

时间:2015-12-26 14:27:21

标签: algorithm numbers

给定一个整数列表,例如:2,3,4,6,10,20,24。我必须找到不分割任何一个给定整数的最小整数。在示例中答案是7.可以有10 ^ 6个整数,每个整数可以小于或等于10 ^ 7。 我试过这个:

#include<bits/stdc++.h>
using namespace std;

#define siz 1000000
#define lim 10000000
int nmbrs[siz+1];
bool divflag[lim+1];
int main()
{
    int n;
    scanf("%d",&n);
    int big=-1;
    for(int k=0; k<n; k++){
        scanf("%d",&nmbrs[k]);
        big = (nmbrs[k] > big )? nmbrs[k] : big;
    }
//    cout<<big;
    for(int k=0;k<n; k++){
        int tmp = nmbrs[k];
        divflag[tmp]=true;
        int root = sqrt(tmp);
        for(int j=2; j<=root; j++){
            int a = tmp/j;
            if(a*j == tmp){
                divflag[a] = divflag[j] = true;
            }
        }
    }

    for(int k=2; k<=big+1; k++){
        if(divflag[k]==false){
            printf("%d\n",k); break;
        }
    }
    return 0;
}

但在线评判的时间限制为1秒,我需要更快的解决方案。

1 个答案:

答案 0 :(得分:1)

  • 解决方案1:暴力

尝试每个候选人从2到最大(元素+1)

每个元素

测试候选人是否划分元素,测试下一个元素

你找到候选人,或者尝试下一个

至少约为90 000

1 000 000个数字在1到10 000 000之间=&gt;大约需要130秒(在我的机器上)

  • 解决方案2:更智能,更快捷

对于每个元素:

获得因子和权力的分解

然后得到每个dividor

使用网格标记每个dividor

最后,在网格中找到最少的无数据

当然,

至少是相同的

=&GT;这需要16秒

并且有很多(很少)可能的优化

  • 解决方案2BIS:更智能,更快

对于每个元素,以后代顺序

检查是否已经在网格中(见下文):如果是,则循环

获得因子和权力的分解

然后得到每个dividor

使用网格标记每个dividor

最后,在网格中找到最少的无数据

当然,

至少是相同的

=&GT;需要13秒 - 元素越多,它的工作速度越快

300 000个元素:48秒=&gt; 35秒