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; } }