题目描述
有108个村庄排在一条公路上,依次编号为0~108-1,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0~an-1,其中保证a0=0.
现在需要建设车站,有两个要求必须被满足:
1、每个有牛牛居住的村庄必须修建车站。
2、相邻车站的距离必须为1或为某个质数。
现给出n和a数组,求需要建设车站的最小数量。
题解:
纪念我第一次做这种题,以前都是做竞赛题
题目看似杂乱无序,但其实冥冥中都遵循着规律
没错就是哥德巴赫猜想
哥德巴赫猜想:
任一大于2的偶数都可写成两个素数之和
所以我们可以将题目总结为:
1.当两站之间距离为素数,那两站之间就不用修站了,就光算上第二个站所修的,num++
2.如果两站之间距离不为素数,但是为偶数,然后偶数可以写成两个素数之和,也就是在两个站中间存在一个位置,将距离分为两个素数距离,所以num+2
3.如果不是素数,也不是偶数。又因为奇数=奇数+偶数,并且2是唯一的偶数的素数,所以如果距离-2是素数的话,就说明中间可以放一个站将距离分为2和另一个素数,如果不能就要放两个站才可以,分别是num+2,num+3
4.每个站本身也要算上
ok,撒花✿✿ヽ(°▽°)ノ✿
代码:
class Solution {
public:
/** * * @param n int整型 * @param a int整型一维数组 * @param aLen int a数组长度 * @return int整型 */
bool iff(int n)
{
if(n==1)return 1;
if(n==2)return 1;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)return 0;
}
return 1;
}
int work(int n, int* a, int aLen) {
// write code here
int num=0;
for(int i=1;i<aLen;i++)
{
int len=a[i]-a[i-1];
if(iff(len))num++;
else if(len%2==0)num+=2;
else if(len%2==1)
{
if(iff(len-2))num+=2;
else num+=3;
}
}
num+=1;
int sum=num;
return sum;
}
};