Step 0
据说 AC 代码是这样的?
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<n-1;
return 0;//华丽结束
}
蓝桥杯的题是真让人大开眼界啊。
Step 1
由于确定的只有 a 0 a_0 a0, a 1 a_1 a1,所以只需要爆枚 a 0 a_0 a0 和 a 1 a_1 a1 的值,然后比较原数组和现数组的不同之处累加,取最小。
枚举到多少呢?
因为题目说 a i ≤ 1 0 5 a_i \leq 10 ^ 5 ai≤105,所以只需要枚举到 1 0 5 10 ^ 5 105 即可。
但因为
n
≤
1
0
5
n\leq 10 ^ 5
n≤105,即使是普通斐波那契数列,一个个比对也会超 __int128
。但不难发现,在最基础的斐波那契数列中,到了第
27
27
27 项就已是
1.21397
×
1
0
5
1.21397 \times 10 ^ 5
1.21397×105,就已经超出了题目的范围,所以只能更改。
所以我们只用在循环条件中加上 a i ≤ 1 0 5 a_i \le 10 ^ 5 ai≤105 即可。
AC CODE
#include<bits/stdc++.h>
using namespace std;
long long a[100010],b[100010];//数组开大,数据不炸
int main()
{
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int ans1;
int minn=2e9;
for(int i=1;i<=100000;i++)
{
ans1=0;//累加器清零
int num;
b[1]=b[2]=i;
if(b[1]!=a[1]) ans1++;
if(b[2]!=a[2]) ans1++;//要判断前两项
for(int j=3;b[j-1]<1e6;j++)
{
b[j]=b[j-1]+b[j-2];
if(b[j]!=a[j]) ans1++;
num=j;
}
ans1+=(n-num-1+1);//因为只累加到了小于等于1e6的部分,所以还要将大于1e6的数量加上
minn=min(minn,ans1);//取最小值
}
cout<<minn;
return 0;//华丽结束
}