zoukankan      html  css  js  c++  java
  • HDU ACM Fibonacci

    Problem Description

    Fibonacci numbers are well-known as follow:

     

    Now given an integer N, please find out whether N can be represented as the sum of several Fibonacci numbers in such a way that the sum does not include any two consecutive Fibonacci numbers.

    Input

    Multiple test cases, the first line is an integer T (T<=10000), indicating the number of test cases.

    Each test case is a line with an integer N (1<=N<=109).

    Output

    One line per case. If the answer don’t exist, output “-1” (without quotes). Otherwise, your answer should be formatted as “N=f1+f2+…+fn”. N indicates the given number and f1, f2, … , fn indicating the Fibonacci numbers in ascending order. If there are multiple ways, you can output any of them.

    Sample Input

    4
    5
    6
    7
    100

    Sample Output

    5=5
    6=1+5
    7=2+5
    100=3+8+89

    题解:贪心求解,此题需要注意的是相邻的两个数不能选择;
    #include<string.h>
    #include<stdio.h>
    #include<math.h>
    using namespace std;
    long long int arr[10001]={0,1,2};
    int main()
    {
    
        long long int i,j,a,b[123],k,m,l,kk;
        for(i=3;i<=90;i++)
            arr[i]=arr[i-1]+arr[i-2];//先打下表
            long long int count=0;
            while(scanf("%lld",&m)!=-1)
            {
            for(kk=0;kk<m;kk++){
                scanf("%lld",&a);
            k=0;
            l=0;count=0;int pp=0;
            for(i=90;i>=1;i-=2)
            {
                pp=0;
                count+=arr[i];
                if(count>a)
                {
                    count-=arr[i];
                    pp=1;
                }
                else if(count==a)
                {
                    k=1;
                    b[l++]=arr[i];
                    break;
                }
                else if(count<a)
                    b[l++]=arr[i];
                if(pp==1)
                     i++;//判断一下上一个数是否选择,若没选,下一个数可以选择
            }
            if(k==1)
            {
            printf("%d=",a);
            for(i=l-1;i>=0;i--)
            {
    
                if(i==0)
                    printf("%lld
    ",b[i]);
                else
                    printf("%lld+",b[i]);
            }
            }
            else
                printf("-1
    ");
            }
            }
            return 0;
    }
  • 相关阅读:
    6种负载均衡算法
    Java中volatile关键字
    剑指offer练习
    linux系统查看IP地址,不显示IP地址或者只显示127.0.0.1
    Nginx负载均衡配置
    集群应用Session一致性实现的三种方案
    rabbitMQ学习
    JDK1.8在LINUX下安装步骤
    ecplise部署gradle web项目
    Kubernetes下的应用监控解决方案
  • 原文地址:https://www.cnblogs.com/moomcake/p/8627634.html
Copyright © 2011-2022 走看看