BZOJ2796: [Poi2012]Fibonacci Representation

来源:互联网 发布:程序员经常加班吗 编辑:程序博客网 时间:2024/06/05 03:38
题目大意:给一个数,问最少可以用几个斐波那契数加加减减凑出来

严谨的证明实在不会,只有感性证明
想想现在要凑一个数,比它大的数我们可以想象成和他等差的比他小的数
然后假如我们不选离他最近的那个数而选择远的,那这种方案一定能用选近的的方案替换,所以每次都要选那个更近的

...当时我数组只开了61竟然A了....

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;long long F[91];void pre(){int i;F[0]=F[1]=1;for(i=2;i<=91;i++)F[i]=F[i-1]+F[i-2];}int solve(long long x){if(x==0) return 0;int i=1;while(F[i]<x) i++;return solve(min(F[i]-x,x-F[i-1]))+1;}void doit(){long long n;scanf("%lld",&n);printf("%d\n",solve(n));}int main(){pre();int T;scanf("%d",&T);while(T--)doit();}

0 0
原创粉丝点击