给定一个整数列表,例如: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秒,我需要更快的解决方案。
答案 0 :(得分:1)
尝试每个候选人从2到最大(元素+1)
每个元素
测试候选人是否划分元素,测试下一个元素
你找到候选人,或者尝试下一个
至少约为90 000
1 000 000个数字在1到10 000 000之间=&gt;大约需要130秒(在我的机器上)
对于每个元素:
获得因子和权力的分解
然后得到每个dividor
使用网格标记每个dividor
最后,在网格中找到最少的无数据
当然,至少是相同的
=&GT;这需要16秒
并且有很多(很少)可能的优化
对于每个元素,以后代顺序
检查是否已经在网格中(见下文):如果是,则循环
获得因子和权力的分解
然后得到每个dividor
使用网格标记每个dividor
最后,在网格中找到最少的无数据
当然,至少是相同的
=&GT;需要13秒 - 元素越多,它的工作速度越快
300 000个元素:48秒=&gt; 35秒