[蓝桥杯 2022 国 C] 斐波那契数组 - 洛谷
思路:读完题之后,我们很容易想到暴力,枚举a[ 1 ]即可(1~1e6)但是,然后再枚举数列即可。
但是这样肯定会超时,我们看题的范围,a[i]的范围不超过1e6,斐波那契数列的第30项之后就大于1e6了,所有我们只需要判断前30个数即可,因为后面的数肯定会修改。
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' #define LL __int128 using namespace std; const int N=2e5+10,M=1e3+10,mod=998244353,INF=0x3f3f3f3f; int a[N],f[N],pre[N]; signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); //预处理斐波那契数列, f[1]=1; for(int i=2;i<=40;i++) { f[i]=f[i-1]+f[i-2]; } //cout<<f[30]<<endl; int n;cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } int ans=1e18; for(int i=1;i<=1e6;i++) { int cnt=0; //最多枚举30项即可。 for(int j=1;j<=min(n,30ll);j++) { if(a[j]==i*f[j]) cnt++; } ans=min(ans,n-cnt); } cout<<ans<<endl; return 0; }
P8808 [蓝桥杯 2022 国 C] 斐波那契数组--枚举
于 2024-03-07 10:28:46 首次发布