题目
http://acm.ecnu.edu.cn/problem/3239/
题意:
给定n (1≤n≤100) 个数,从中找出尽可能多的数使得他们能够组成一个最长的等差数列。输出该最长等差数列的长度。
注意:当n=1时,构成长度为1的等差数列。
解题思路
由于这些数字不一定要连续,所以先对所有数字排序,便于后续比较大小和选取递增的序列。
用以下几个变量维护一个等差数列:
- i 记录首项的下标,j 记录第二项的下标用于计算公差delta,k 用于延伸该数列。
- tmp_len记录当前的等差数列长度,pre用于记录该数列里的最后一个数
- 延伸的条件为
num[k] - num[pre] == delta
值得注意的是:
- 对于排序后的数组,若最小值=最大值,说明数组各项为同一个数,因此最大长度即数组长度n(含n=1的情况)
- 利用数组排好序,若num[k]-num[pre]已经大于公差,则后面的数和pre的差只会更大,可以停止延伸了
AC代码
#coding=utf-8
if __name__ == '__main__':
kase = int(input())
for t in xrange(kase):
n = int(input())
num = []
for i in xrange(n):
a = int(input())
num.append(a)
num.sort() #数组排序
if num[0] == num[n-1]: #最小值和最大值相等
print "case #%d:"%t
print n
continue
max_len = 2 #记录最大长度
for i in xrange(n): #首项
for j in xrange(i+1, n): #第二项确定公差
pre = j
tmp_len = 2
delta = num[j] - num[i] #新的公差
for k in xrange(j+1, n):
if (num[k] - num[pre]) == delta: #发现新的一项
tmp_len += 1
pre = k #维护pre
if num[k] - num[pre] > delta: #之后都不存在
break
max_len = max(tmp_len, max_len) #更新最大长度
print "case #%d:"%t
print max_len