题目
题目链接:Fibonacci
题解
根据题意,如果该数字的任何一种构造都存在两个连续的斐波那契数(此处的连续针对的是数字在斐波那契数列中的位置),则输出-1。
但是可以比较容易地发现:如果该数字的某种构造中存在两个连续的斐波那契数,那么一定可以用这之后的一个斐波那契数代替这两个数字,故我们不需要考虑-1的情况。
在构造的时候每次取所可以取的数字中最大的一个,判断是否存在连续的情况,若存在则换下一个位置,直到不存在连续时减去该位置的斐波那契数,直到数字减为0.
斐波那契数组开的大一点。。。开小了一直WA可太惨了QAQ
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
using namespace std;
//#pragma GCC optimize(2)
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define ull unsigned long long
#define ll long long
#define rep(i, x, y) for(int i=x;i<=y;i++)
#define mms(x, n) memset(x, n, sizeof(x))
#define mmc(A, tree) memcpy(A, tree, sizeof(tree))
#define eps (1e-8)
#define PI (acos(-1.0))
#define INF (0x3f3f3f3f)
#define mod (ull)(1e9+7)
typedef pair<int, int> P;
int f[50];
void fib() {
f[1] = 1;
f[2] = 2;
for (int i = 3; i < 50; i++) f[i] = f[i - 1] + f[i - 2];
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
fib();
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
int t = n;
vector<int> ans;
set<int> st;
while (t != 0) {
int pos = upper_bound(f + 1, f + 50, t) - f - 1;
if (f[pos] > t) pos--;
while (st.find(pos + 1) != st.end() || st.find(pos - 1) != st.end()) {
pos--;
}
st.insert(pos);
ans.push_back(f[pos]);
t -= f[pos];
}
printf("%d=", n);
int size = ans.size();
for (int i = size - 1; i >= 0; i--) {
if (i == size - 1) printf("%d", ans[i]);
else printf("+%d", ans[i]);
}
printf("\n");
}
return 0;
}