题目:
有108个村庄排在一条公路上,依次编号为0~108-1,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0~an-1,其中保证a0=0.
现在需要建设车站,有两个要求必须被满足:
1、每个有牛牛居住的村庄必须修建车站。
2、相邻车站的距离必须为1或为某个质数。
现给出n和a数组,求需要建设车站的最小数量。
输入实例:3,[0,7,11]
输出:4
这里我使用的是python来进行求解。
求解思路:求牛牛村村庄之间距离的最少的素数个数。这里需要用到哥德巴赫猜想。
首先: 求出牛牛村庄之间的距离,如果距离为素数,那么在牛牛村庄之间就不需要建立车站;
距离为非素数(非素数):考虑两种情况;
如果为偶数,就可以表示成两个素数之和;
如果为奇数,表示成 距离(len) len=(en-2)+2
如果len-2为素数,那么len就可以表示成len-和2两个素数之和;
如果len-2为偶数,其中len-2可以表示成两个素数之和,len就可以表示成三个素数之和;
根据这个思路来进行代码编写:
python来进行编写:
p = input()
n = p.split(',',1)[0]
a = p.split(',',1)[1]
n = int(n)
a = eval(a) #eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果
a.sort()
#因为需要进行相应的计算,所以需要将输入利用切片进行拆分,拆分成所需要的形式,并进行转换,
import math
class Solution:
#这里的函数if_n就是为了判断这个数是不是素数。
def if_n(self,num):
if num == 0 or num == 1:
return False
if num == 2:
return True
for i in range(2,int(math.sqrt(num) + 1)):#判断一个比2大的数是不是素数。
if num%i == 0:
return False
return True
def work(self , n , a ):
count = 0
for i in range(n-1): #这里的n是牛牛村庄的个数。
temp = a[i+1]-a[i] #temp用来计算相邻村庄的距离。
if self.if_n(temp) or temp == 1: #距离如果是素数或者为1就不用再之间建立车站。
continue
else: #如果不是素数,判断是否为偶数
if temp%2 == 0: 是偶数,距离有两个素数之和,需要在之间建立一个车站。
count = count + 1
continue
else:
if self.if_n(temp - 2): #不是偶数,需要将距离进行拆分成len-2和2,判断len-02是否为素数,如果为素数,距离是由len-2和2组成,就需要在之间建立一个车站。
count = count + 1
continue
else:
count = count + 2 #len-2部署素数,那么就是由三个数组成,就需要在之间建立两个车站。
continue
return n+count #最后的总的车站是牛牛村庄的个数和之间建立的车站之和。
s= Solution() #先调用类,在调用类中的函数。
print(s.work(n,a))