X轴上10^8个点,从左到右依次编号为0~10^8-1,相邻点距离为1,其中有n个点有特殊意义,从小到大依次为a0~an-1,其中保证a0=0.
现在需要建设收集站,有两个要求必须被满足:1、每个有意义的点必须修建收集站。
2、相邻收集站的距离必须为1或为某个质数。
现给出n和a数组,求需要建设收集站的最小数量。
3,[0,7,11]
4
在0,7,8,11处建造收集站,差值分别为7,1,3,符合要求
输入数据包含一个数n和一个长度为n的数组a,数组a的下标为0~n-1,保证a数组递增,且a0=0。
输出一个整数,表示答案。
1<=n<=1000,a数组中数值保证小于10^8
private int between(int num) {
if (isPrime(num) || num == 1)
// 1 和 素数 中间不需要站点
return 0;
else if ((num & 1) == 0)
// 哥德巴赫猜想: 任一大于2的偶数,都可表示成两个素数之和, 需要一个连接站点
return 1;
else if (isPrime(num - 2))
// 大于二的偶数部分分采用哥德巴赫猜想,
// 奇数部分采用孪生素数猜想和强哥德巴赫猜想
// 孪生素数猜想: 存在无穷多个素数P,使得P+2是素数,
// 孪生素数猜想使得站点间减小到1,即优于强哥德巴赫猜想的2(针对本题),
// 所以优先于强哥德巴赫猜想
return 1;
else
// 强哥德巴赫猜想: 任一大于5的奇数都可写成三个素数之和, 需要两个连接站点
return 2;
} public class Solution {
/**
*
* @param n int整型
* @param a int整型一维数组
* @return int整型
*/
public int work (int n, int[] a) {
int res=1;
for(int i=1; i<a.length;i++){
if (iemzhishu(a[i]-a[i-1])){
res++;
}
else if ((a[i]-a[i-1])%2==0||iemzhishu(a[i]-a[i-1]-2)){
res=res+2;
}
else{
res=res+3;
}
}
return res;
}
public boolean iemzhishu(int b){
for (int i=2;i<=Math.sqrt(b);i++){
if(b%i==0){
return false;
}
}
return true;
}
} import java.util.*;
public class Solution {
public int work(int n, int[] a) {
int res=1;
for (int i = 1; i < n; i++) {
int disance=a[i]-a[i-1];
if(isPrime(disance)) {
res++;
}else if(disance%2==0||isPrime(disance-2)){
res+=2;
}else{
res+=3;
}
}
return res;
}
public boolean isPrime(int n) {
for (int i = 2; i <= Math.sqrt(n + 0.0); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}