map就是建一个红黑书 把每个元素的值都加进树种,当查找这个元素的值时算法复杂度logn
关于map的用法:
map<类型1,类型2> mp(名字) 初始化
mp.clear() 清空;
mp[下标] = 值
mp.begin();
mp.end();
mp.size();
mp.empty();
mp.count();
mp.find();
此题有几种情况:
1.f0 =0 f1 = 0
2.f0 = 0 f1 = x f2 =x 然后逐步递增或递减
3.f0 = x!=0 f1 = y!=0 这种情况正常思路 枚举看情况是否满足。。。
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
map<int,int>mp;
map<int,int>mp2;
int n;
int main()
{
long long a[2000];
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
mp[a[i]]++;
}
int ans = 2,z = mp[0];
if(z>ans)ans = z;
if(z)
{
for(int i=0;i<n;i++)
if(a[i]){
if(mp[a[i]]>1)
{
int sum = 2;
long long f1 = 0,f2 = a[i];
while(mp[f1+f2])
{
sum++;
int t = f2;
f2 = f1+f2;
f1 = t;
}
if(sum>ans)ans = sum;
}
}
}
sort(a,a+n);
for(int i=0;i<n;i++)
if(a[i]&&a[i]!=a[i-1])
{
for(int j=0;j<n;j++)
if(i!=j)
{
int sum = 2,f1 = a[i],f2 = a[j];
bool sym = false;
mp2[f1]++;
mp2[f2]++;
while(mp2[f1+f2]!=mp[f1+f2])
{
sum++;
mp2[f1+f2]++;
int t = f2;
f2 = f1+f2;
f1 = t;
}
if(sum>ans)ans = sum;
mp2.clear();
}
}
mp.clear();
printf("%d\n",ans);
}
return 0;
}