洛谷 P8808 [蓝桥杯 2022 国 C] 斐波那契数组 题解

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 ai105,所以只需要枚举到 1 0 5 10 ^ 5 105 即可。

但因为 n ≤ 1 0 5 n\leq 10 ^ 5 n105,即使是普通斐波那契数列,一个个比对也会超 __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 ai105 即可。

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;//华丽结束 
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值