牛客在线试题:幸运子序列
题目描述
牛牛得到一个长度为n的整数序列V,牛牛定义一段连续子序列的幸运值为这段子序列中最大值和次大值的异或值(次大值是严格的次大)。牛牛现在需要求出序列V的所有连续子序列中幸运值最大是多少。请你帮帮牛牛吧。
输入描述:
第一行一个整数n,即序列的长度。(2<= n <= 100000) 第二行n个数,依次表示这个序列每个数值V[i], (1 ≤ V[i] ≤ 10^8)且保证V[1]到V[n]中至少存在不同的两个值.
输出描述:
输出一个整数,即最大的幸运值
解析:
开始时读错题了,必须吐槽这出题人,中文水平太低了!!!!!连续子序列,我以为就是 1 2 3 4 或 4 3 2 这样的间距为1的连续了。谁知道到其实是位置连续。
导致程序也出了问题。
先把按照数值连续的结果放出来吧。
# n=int(input()) # s=list(map(int,input().split())) n = 5 s = [5, 2, 1, 4, 3] # s=[9,8,3,5,7] maxxorv = 0 lian = 0 a = 0 b = 0 def result(): #计算一次最大值 global maxxorv,a,b, lian if maxxorv < (max(a, b) ^ (max(a, b) - 1)): maxxorv = (max(a, b) ^ (max(a, b) - 1)) a, b, lian= 0, 0, 0 for x in range(n - 1): if abs(s[x] - s[x + 1]) != 1: result() elif (s[x] - s[x + 1]) == -1: # 递增序列 if lian==0: lian = -1 a = s[x] b = s[x + 1] elif lian==-1: b = s[x + 1] elif lian==1: result() else: # 递减序列 if lian == 0: lian = 1 a = s[x] b = s[x + 1] elif lian == 1: b = s[x + 1] elif lian == -1: result() result() #最后再算一次 print(maxxorv)
第二次,真正按照位置顺序写的。但是遍历所有子串,报超时错误。
n=int(input()) s=list(map(int,input().split())) # n = 5 # s = [5, 2, 1, 4, 3] # s=[9,8,3,5,7] # s=[11,4,18,16,3] maxxorv=0 a_b=0 for x in range(n): a,b,c = s[x],0,0 for y in range(x+1,n): c=s[y] if c<b: continue if c>a: b, a = a, c if a>c>b: b=c a_b=a^b if maxxorv <a_b: maxxorv = a^b print(maxxorv)
最后的终极解决方案:遍历s串,当做次大值,然后先向左寻找第一个大于他的值,然后两者做 异或;再向右寻找第一个大于他的值,然后两者做 异或。每一次计算,均将结果与最终结果进行比较,如果大,就存起来。
n=int(input()) s=list(map(int,input().split())) xor_list=0 for x in range(n): for y in range(x+1,n): #向右循环遍历 if s[y]>s[x]: xor_list=max(xor_list,s[y]^s[x]) break for y in range(x-1,-1,-1): #向左循环遍历 if s[y]>s[x]: xor_list=max(xor_list,s[y]^s[x]) break print(xor_list)