【题目】
【题解】
题意:给定一个长度为n的每个元素各不相同的序列,要求选择元素组成等差数列,输出最大可选择的个数。
思路:因为n只有5000,考虑枚举首项和第二项,这样就知道了公差d,更新最长的等差数列长度即可。这里我用了hash_map记录每个数字是否存在,这样的查询是O(1)的,代码的时间复杂度为O(n^2);如果用map的话查询是O(logn),复杂度为O(n^2*logn)会超时的。。
【代码】
#include <cstdio>
#include <algorithm>
#include <hash_map>
using namespace std;
using namespace __gnu_cxx;
int a[5005];
hash_map <int,int> mp;
int main()
{
int n;
while(~scanf("%d",&n)){
mp.clear();
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),mp[a[i]]=1;
sort(a+1,a+n+1);
int ans=2;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int d=a[j]-a[i],sum=2;
while(mp.count(a[i]+d*sum)) sum++;
ans=max(ans,sum);
}
}
printf("%d\n",ans);
}
return 0;
}