[蓝桥杯 2022 国 C] 斐波那契数组

#include<bits/stdc++.h>  
using namespace std;  
long long a[100010],b[100010];
int main()  
{  
	int n;
	cin>>n;////从标准输入读取一个整数n,表示数组a的长度

	for(int i=1;i<=n;i++)
    //循环从1到n,通过scanf读取数组a的每个元素。
	{
		scanf("%d",&a[i]);
	}

	int ans1; //用于记录每次尝试生成斐波那契数列与原数组a不同元素的数量。
	int minn=2e9; //初始化minn为一个较大的值(2e9即2*10^9),用于存储最小的不同元素数量。

	for(int i=1;i<=100000;i++)
	{
		ans1=0;//累加器清零
		int num;
		b[1]=b[2]=i;//将i赋值给前两位
		if(b[1]!=a[1]) ans1++;
		if(b[2]!=a[2]) ans1++;//要判断前两项
        //外层循环从1到100000,每次循环设定斐波那契数列的起始值b[1]和b[2]都为i,然后判断起始的两项与数组a对应项是否相同,不同则ans1加1。


		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;
		}
        //内层循环从3开始,不断生成斐波那契数列b,并与数组a对应元素比较,不同则ans1加1,同时记录当前生成到的下标num。


		ans1+=(n-num);//因为只累加到了小于等于1e6的部分,所以还要将大于1e6的数量加上
		minn=min(minn,ans1);//每次内层循环结束后,更新minn为当前minn和ans1中的较小值。
	}
    //循环结束,现在生成了i个斐波那契数,与输入数组进行多次比较,找到了最小值

	cout<<minn;//将最小值输出
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看着不爽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值