您现在的位置是:首页 >其他 >蓝桥杯2022年第十三届决赛真题-取模(C/C++/Java组)网站首页其他
蓝桥杯2022年第十三届决赛真题-取模(C/C++/Java组)
简介蓝桥杯2022年第十三届决赛真题-取模(C/C++/Java组)
题目描述
如果数组 A = (a0, a1, · · · , an−1) 满足以下条件,就说它是一个斐波那契数组:
1. n ≥ 2;
2. a0 = a1;
3. 对于所有的 i(i ≥ 2),都满足 ai = ai−1 + ai−2。
现在,给出一个数组 A ,你可以执行任意次修改,每次修改将数组中的某个位置的元素修改为一个大于 0 的整数。请问最少修改几个元素之后,数组 A 会变成一个斐波那契数组。
输入格式
输入的第一行包含一个整数 n ,表示数组 A 中的元素个数。
第二行包含 n 个整数 a0, a1, · · · , an−1,相邻两个整数之间用一个空格分隔。
输出格式
输出一行包含一个整数表示最少需要修改数组 A 中的几个元素之后,数组 A 可以变为一个斐波那契数组。
样例输入
5
1 2 2 4 8
样例输出
3
提示
将原数组修改为 (1, 1, 2, 3, 5),最少修改三个元素变成了一个斐波那契数组。
对于所有评测用例,2 ≤ n ≤ 1e5 ,1 ≤ ai ≤ 1e6。
解析:
题目有个坑点,n为1e5,但是题目中的 ai 最大为1e6,当n为30的时候,以1开头的斐波那契数列的值已经超过了1e6,所以 n=30 后面的数全部需要修改。
我们枚举以 1~1e6 开头的斐波那契数列,并且记录与原数列相同的项的数量,维护最大值maxx,最后用数列的总项数减去最大值maxx即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll n,a[N],f[N],maxx;
int main(){
scanf("%lld",&n);
int k=n;
if(n>30) n=30;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=1e6;i++){
int count=0;
f[1]=f[2]=i;
if(a[1]==i) count++;
if(a[2]==i) count++;
for(int j=3;j<=30;j++){
f[j]=f[j-1]+f[j-2];
if(f[j]>1e6) break;
if(a[j]==f[j]) count++;
}
if(count>maxx) maxx=count;
}
cout<<k-maxx;
return 0;
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。