做这道题时理解出了问题,在心里默认输入数组的首项一定是正确的,只需要根据这个首项生成一个正确的数组,用正确数组和输入数组比较出不同项的数量即可
结果......
想不通后参考了题解,才反应过来输入数组的首项原来也可能是叛徒!根据这个叛徒生成的"正确数组"只在运气好的时候奏效......
那没辙了,我也只会暴力,那就生成初项包含所有数据用例要求的正确数列 (1~1000000),用这些数列去比较输入数列,得出一个最大值,本题完毕。
import java.util.Scanner;
public class FibonacciArrays {
static int max=0,items; // max:输入数列与正确数列匹配成功的最大值 items:正确数组中,项值不大于1000000的项数
static int arr[]=new int[100001] , fi[]=new int[100]; //arr:输入数组 fi:正确数组
public static void main(String[] args) {
//数据输入
Scanner scan = new Scanner(System.in);
int n=scan.nextInt(); //n:输入数组的长度
for(int i=0;i<n;i++){
arr[i] = scan.nextInt(); //填充输入数组
}
scan.close();
//数据处理
for(int i=1;i<=1000000;i++){ //生成初项包含所有数据用例要求的正确数列 (1~1000000)
getFi(i);
int count = contrast(); //挨个与输入数组进行匹配
if(count > max) //找出匹配成功的最大值
max = count;
}
//数据输出
System.out.println(n-max);
}
public static void getFi(int first){ //生成指定初项开始的一个正确数列
items=2;
fi[0] = fi[1] = first;
for(int i=2;;i++){
fi[i] = fi[i-1] + fi[i-2];
if(fi[i] > 1000000) //fi[i]超限后停止
break;
items++;
}
}
public static int contrast(){ //对比arr和fi,返回两者匹配成功的项数
int count =0;
for(int i=0;i<items;i++){
if(arr[i] == fi[i]){
count++;
}
}
return count; //返回匹配成功的数目
}
}
心得:刚开始接触算法题,经验不足,一些弯还是绕不过来,继续做题积累经验吧