CF633D Fibonacci-ish 题解
洛谷博客复兴后的第一篇题解。
题意
小y最近迷上了fibonacci数列,他定义了一种数列叫fibonacccccci数列:
1、这个数列包含至少2个元素;
2、f[0]和f[1]是任意选取的;
3、f[n+2]=f[n+1]+f[n] (n>=0);
现在,给出一个数列a[1..n],你可以改变数列元素的顺序,使得a[1..m]满足fibonacccccci数列的条件,请求出最大的m。
搞一个桶,计数即可。
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int a[N], f[N], n, ans, now;
map<int, int>m;
int main() {
scanf("%d", &n);
for(int i=1; i<=n; i++) scanf("%d", &a[i]), ++m[a[i]];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(i!=j) {
if((!a[i])&&(!a[j])) {if(m[0]>ans) ans=m[0];continue;}
int f1=a[i], f2=a[j]; f[1]=f1,f[2]=f2, now=2, m[f1]--, m[f2]--;
int w; while(m[w=(f1+f2)]>0) {m[w]--; f[++now]=w; f1=f2; f2=w;}
if(now>ans)ans=now; for(int i=1; i<=now; i++)m[f[i]]++;
}
printf("%d", ans);
}