NO IMAGE

題目描述:

序列中任意個連續的元素組成的子序列被稱為該序列的字串
現在給你一個序列P和一個整數K,詢問元素和是K的倍數的子串的最大長度
比如序列{1,2,3,4,5},給定的整數K為5,其中滿足條件的子串為{5}、{2,3}、{1,2,3,4}
、{1,2,3,4,5},那麼答案就為5,因為最長的子串為{1,2,3,4,5};
如果滿足條件的子串不存在,就輸出0

輸入:

第一個含一個整數N,1<=N<=10^5
第二行包含N個整數Pi,Pi表示序列P第i個元素的值。0<=Pi<=10^5
第三行包含一個整數K,1<=K<=10^5

解題思路:

這裡提供一種O(N)複雜度的解題方案。

1、就是首先獲得陣列的累加和,即sum_s。(例如,[0,1,2,3,4]的累加和為[0,1,3,6,10]),這樣做的目的,其實為了得到,子序列的和,即前面兩個數的和為(3-0),第2個數到第三個數的和為6-1=(2 3)

2、然後,我們要求減少演算法的複雜度,那麼我們可以先對長度較長的子序列判斷它是否是K的整數倍。因此,我們首先取出子序列首尾的下標及其長度,並按長度排序。

3、對排好序的子序列一一遍歷,只要出現滿足情況的子序列,即為最長子序列。

程式碼實現:


from itertools import combinations
n=int(raw_input())
s=[int(i) for i in raw_input().split()]
k=int(raw_input())
sum_s=[0] 
lingshi=0
for i in s:
lingshi =i
sum_s.append(lingshi)
#取出子序列首尾的下標及其長度
sort_list=map(lambda x :[x[0],x[1],abs(x[0]-x[1])],list(combinations(range(len(sum_s)),2)))
#按長度排序
sort_list=sorted(sort_list, key=lambda x:x[2],reverse=True)
for x in sort_list:
if x[0]>x[1]:
if (sum_s[x[0]]-sum_s[x[1]])%k==0:
print x[0]-x[1]
flag=0
break
if x[1]>x[0]:
if (sum_s[x[1]]-sum_s[x[0]])%k==0:
print x[1]-x[0]
flag=0
break 
if flag!=0:
print 0