1.构造一个数组
任意给出一个正整数N,构造一个数组arr,
对于i<k<j,满足arr[i] + arr[j] != 2*arr[k].
解题思路:
假设现在有一个满足条件的数组arr,从而:
2arr[i]-1 + 2arr[j] != 2(arr[k]+1)
2arr[i] + 2arr[j] != 2(2arr[k])
从而将arr映射到奇数列和偶数列中,分别得到arr_1 和arr_2,这两个数组也是满足条件的数组。
更新arr后也是满足条件的,arr如下式更新,变为原先2倍长度的数组:
arr = arr_1 + arr_2
当i,k,j都位于arr_1和arr_2中,满足条件;
当i位于arr_1,j位于arr_2时,arr[i]为奇数,arr[j]为偶数,故arr[i]+arr[j]为奇数,而2arr[k]为偶数,故:
arr[i] + arr[j] != 2*arr[k]
n=1,arr=[1]就满足;
n=2,做奇偶映射,可以变为长度为2的数组;
n=3,做奇偶映射,可以变为长度为4的数组;
...
n=n,做奇偶映射,可以变为长度为np.low(2,n)的数组;
需要更新的的次数为:
n = math(math.log(N,2))
为了保持与N长度一致:
arr = arr[:N]
程序:
import math
def creatArray(N):
arr = [1]
if N == 1:
return arr
sq = math.ceil(math.log(N,2))
for i in range(sq):
arr_1 = [2*i-1 for i in arr]
arr_2 = [2*i for i in arr]
arr = arr_1 + arr_2
arr = arr[:N]
return arr
def proof(arr):
for i in range(len(arr)-2):
for k in range(i+1,len(arr)-1):
for j in range(k+1,len(arr)):
if arr[i] + arr[j] == 2*arr[k]:
print('Faield!')
return
print('Sucessed!')