HDU 5620 KK's Steel(斐波那契数列的巧妙应用)

来源:互联网 发布:2016网络购物数据分析 编辑:程序博客网 时间:2024/06/05 04:15

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5620

题意:给一根长度为n的钢管,问最多能截成几段钢管,使得截成的钢管互不相等且均不能构成三角形

思路:斐波那契数列的巧妙应用,该开始没想到,以为是求公差为1的等差数列的和,这种思路是错误的,例如4.5.6就能组成三角形等等,假设a[0]=0,a[1] =1,则第47项斐波那契数列就会超int,刚开始数组开小了,结果数据错了,头一次遇到这种问题,代码中的2个数组可以压缩成一个数组,懒得改了

AC代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <cstring>#include <climits>#include <cmath>#include <cctype>const int inf = 0x7f7f7f7f;//2139062143typedef long long ll;using namespace std;ll a[110],b[110];void cf(){    int i;    a[1] = 1;    b[1] = 1;    a[2] = 2;    b[2] = 3;    for(i=3; i<100; i++)    {        a[i] = a[i-1] + a[i-2];        b[i] = b[i-1] + a[i];    }}int main(){    int t;    cf();    scanf("%d",&t);    while(t--)    {        ll sum;        int i;        scanf("%I64d",&sum);        for(i=1; i<100; i++)        {            if(b[i] == sum)            {                break;            }            else if(b[i] > sum)            {                i--;                break;            }        }        printf("%d\n",i);    }    return 0;}


0 0
原创粉丝点击