SRM622 Div2 EASY FibonacciDiv2
SRM622
朝SRM
九時ぐらいに起床したがぐだぐだして始まって五分ぐらいして参戦
easyとmedともに通ったがmedが遅くて微妙な順位
結果
FibonacciDiv2 find Level One 0:05:44.973 Passed System Test 240.29BoxesDiv2 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] = 0F[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