紙コーダー未満

主に競技プログラミングについてです。Topcoder(togatogah)、Codeforces(togatoga)に参加してます。

SRM622 Div2 EASY FibonacciDiv2

SRM622
SRM
九時ぐらいに起床したがぐだぐだして始まって五分ぐらいして参戦
easyとmedともに通ったがmedが遅くて微妙な順位

結果

FibonacciDiv2 find Level One 0:05:44.973 Passed System Test 240.29
BoxesDiv2 findSize Level Two 0:27:10.034 Passed System Test 301.38
Subsets findSubset Level Three 0:30:11.621 Compiled 0.00
847->887
灰色辛すぎる・・・

問題

F[0] = 0
F[1] = 1
F[i] = F[i - 1] + F[i - 2] i>=2

フィボナッチ数列が定義されている。(0,1,1,2,3,5,8,13,・・・)
ある整数N(1<=N<=1000000)が与えられる。
そのNを+1または-1増減させて、フィボナッチ数にする最小のステップを返せ

解法

Nが大きくないのでフィボナッチ数列を50ぐらいまで列挙して全通りを試して絶対値をとってminをとった。

コード

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <numeric>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
#include <bitset>
#include <fstream>
#include <limits.h>
 
#define mp       make_pair
#define rep(i,n) for(int i=0;i<(n);i++)
 
using namespace std;
 
typedef    long long          ll;
typedef    pair<int,int>      pii;
 
const int INF=1<<29;
const double EPS=1e-9;
 
const int dx[]={1,0,-1,0},dy[]={0,-1,0,1};
ll f[60];
class FibonacciDiv2 {
    public:
    int find(int N) {
  int result;
    f[0] = 0;
    f[1] = 1;
    for(int i = 2;i <=50;i++){
        f[i] = f[i - 2] + f[i - 1];
        // cout <<f[i]<<endl;
    }
    ll ans =INF;
    for(int i = 0;i <=50;i++){
        ans = min(ans,abs(N - f[i]));
    }
    result = ans;
        return result;
    }
};
 
// Powered by Greed 2.0-RC