DASO - Dãy số Fibonacci (OLPCĐ 2013)

Dữ liệu vào: standard input
Dữ liệu ra: standard output
Giới hạn thời gian: 1.0 giây
Giới hạn bộ nhớ: 128 megabyte
Đăng bởi: admin

       Một dãy số gồm n số nguyên f1, f2, ... , fn được gọi là dãy có tính chất của dãy số Fibonacci
nếu n ≥ 3 và với mọi số fi (i ≥ 3) thõa mãn điều kiện fi = fi-1 + fi-2.
      Ví dụ, dãy 1, 1, 2, 3, 5, 8  là dãy số có tính chất của dãy số Fibonacci; còn dãy 3, 3, 6, 9, 14, 23 không phải là dãy số có tính chất của dãy số Fibonacci.
Yêu cầu: Cho dãy số nguyên a1, a2, ... , an. Hãy  tìm một dãy con liên tiếp gồm nhiều phần tử nhất của dãy số a1, a2, ... , an mà có tính chất của dãy số Fibonacci. (Dãy con liên tiếp là dãy có dạng: ai, ai+1, ai+2,... ,ai+k).
Dữ liệu nhập: 
-  Dòng đầu chứa số nguyên n (3 ≤ n ≤ 30.000)
-  Dòng thứ hai chứa n số nguyên a1, a2, ... , an (|ai| ≤ 109).
Dữ liệu xuất:
- Nếu tồn tại dãy con Fibonaci, in ra số lượng phần tử của dãy con tìm được.
- Nếu không tồn tại dãy con liên tiếp nào có tính chất của dãy số Fibonacci, in ra -1.

Ví dụ

  • input
    7
    1 3 3 6 9 14 23
    output
    4
  • input
    7
    1 1 2 3 5 8 13
    output
    7
  • Solution : 
  • #include<iostream>
    #include<bits/stdc++.h>
    using namespace std;
    int n;
    // long BinarySearch(int x){
    // int left = 0,right = n-1;
    // while(left <= right){
    // int mid = (left + right)/2;
    // if(a[mid] == x) return mid;
    // else if(a[mid] < x) left = mid + 1;
    // else right = mid - 1;
    // }
    // return -1;
    // }
    int main (){
    cin >> n;
    int a[n];
    for(int i = 0;i<n;i++){
    cin >> a[i];
    }
    int dem = 0 , max = 0;
    for(int i = 0;i<n;i++){
    if(a[i+2] == (a[i]+a[i+1])) dem++;
    else {
    if(dem + 2 > max && dem != 0)
    max = dem + 2;
    dem = 0;
    }
    }
    if(dem + 2 > max && dem != 0){
    max = dem + 2;
    }
    if(max == 0) cout << "-1";
    else cout << max;
    }

Nhận xét

Bài đăng phổ biến từ blog này

OCSE - Ốc sên ăn rau

MERGENUM - Ghép số

BACO - Bàn cờ