好久没有更新过博客了,原因其实就是懒,好久一段时间没有什么追求,工作上也是长时间没有太大的压力,浑浑噩噩度日。最近脱单了,女朋友真的很优秀,突然就有种紧张感,也突然觉得自己配不上人家,无论是学校还是工作能力,其实只有我自己知道看起来光鲜的工作表面下,是自己难以启齿那非常欠缺的实力。所以最近其实也在想考研(非全),希望可以提升一下自己,感觉自己这种懒癌患者,没有一点压力根本无法谈及进步,看了一天的计算机相关专业的非全信息,还是没有理清头绪。想想重拾一下本博,希望以后可以持续不断的更博,无论是工作上的进步还是以后真的打算考研的学习历程,我都希望可以坚持下来。加油吧,再也不要做一个混子了,我要配的上她-我的月亮。
有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处建造车站,符合要求。
个人思路:有牛的村庄必须要建车站,所以最后一个有牛的村庄是最后一个车站(最小数量)。示例中11,所以对应的最少0,7,11是必须要建车站的,题目中还有一个要求是车站距离要是质数,那么7-11之间距离4,显然不符合要求,所以要在中间再建一个车站。那么由示例这个点去发散思维, n是必须建造车站的数量,a[i+1]-a[i]如果是质数,则不用在中间加车站;如果a[i+1]-a[i]不是质数,result++。那么验证一下如果是[0,9,13],那么0-9之间也是再加一个车站就可以了么?0,9之间质数有2,3,5,7。在2,7任意加一个车站就可以了,所以是0,2,9,11,13或者0,7,9,11,13。
结果:错误!!!
分析:还是考虑的情况不周全,看了网上的分析才发现自己的思维太简单了。相邻有牛的村庄,距离差如果是质数,则不用加车站。但是如果不是质数,分类讨论如果是偶数的话,则偶数可以是两个质数的和,则加一个车站即可;如果是奇数,重点在这里!!!因为我举例9,9-2=7也是质数,所以9可以是两个质数的和,但是如果是质数17,那么就不一样了,质数17想想可以是两个质数的和吗?0-17中间的质数有2,3,5,7,11,13,发现并不可以啊!!!所以这里可以从2着手,因为如果任意一个质数假设是j,j-2是质数那么j=2+(j-2),即两个质数之和,如果j-2不是质数那么j就是三个质数之和,所以需要result+=2。
居然还是个世界级的数学难题,哥德巴赫猜想,有木有被秀到!!!太强了。那么废话不多说,我们直接代码实现一下。(弱鸡代码能力,求指教,别喷我啊)
int is_prime(int a){
for(int i = 2; i < a; i++)
{
if(a % i == 0)
{
return 0;
}
}
return 1;
}
int work(int n, int* a, int aLen) {
int result = 1;
if(n==0 && n==1)
{
aLen = n;
return aLen;
}
for(int i = 0; i < n-1; i++)
{
int len = a[i+1]-a[i];
if(is_prime(len) == 1)
{
result++;
}
else if(len % 2 == 0 || is_prime(len-2))
{
result+=2;
}else{
result+=3;
}
}
aLen = result;
return aLen;
}