题目描述
有10^8个村庄排在一条公路上,依次编号为010^8-1,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0an-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; } };