• 上下火车(斐波那契)


    上下火车

    时间限制: 1 Sec  内存限制: 125 MB
    提交: 26  解决: 14
    [提交][状态][讨论版][命题人:外部导入]

    题目描述

    火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。试问x站开出时车上的人数是多少?
     

    输入

    每个测试文件只包含一组测试数据,每组输入四个整数a、n、m和x。

    输出

    对于每组输入数据,输出从x站开出时车上的人数。

    样例输入

    5 7 32 4

    样例输出

    13

    提示

    解析:

    车站编号: 1  2  3 4 5 6 7

    上车人数 a b a + b a + 2*b 2*a+3*b 3*a+5*b ......

    下车人数 0 b b a + b a+2*b 2*a+3*b ......

    剩下的人数 a  a 2 * a   2*a + b 3*a+2*b 4*a+4*b ......

    用表易得:上车人数=fib( n - 3 ] + fib( n - 2 ) == m;

        剩下的人数=( fib( x - 2 ) + 1 ) *a + (fib( x - 1 ) + 1 ) * b;

    #include<iostream>  
    #include<cstdio>  
    using namespace std;   
    const int maxn = 1005;  
    int num[ maxn ], fib[ maxn ];  
    int main()  
    {  
        int n, a, m, x, b;  
        fib[ 0 ] = 0;  
        fib[ 1 ] = 1;  
        for( int i = 2; i < maxn; ++i )  
            fib[ i ] = fib[ i - 1 ] + fib[ i - 2 ];  
        while( cin >> a >> n >> m >> x )
        {  
            // m = ( fib[ i - 2 ] + 1 ) * a + ( fib[ i - 1 ] - 1 ) * b;   
            b = ( m  - ( fib[ n - 3 ] + 1 ) * a ) / ( fib[ n - 2 ] - 1 );  
            long long ans = ( fib[ x - 2 ] + 1 ) * a + ( fib[ x - 1 ] - 1 ) * b;  
            cout << ans << endl;  
        }  
        return 0;  
    }  
    
    
     
  • 相关阅读:
    OSI Model Reference graphic / What do you guys think? Anything to edit/remove/add?
    Iframe Target for a Link
    Abp FullAuditedAggregateRoot
    After Effects上课视频
    Openwrt NAT ALG
    ipcalc.sh
    网络流量测试工具
    NatTypeTester
    基于DPDK开源项目
    GPS的调试与报文解析
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271120.html
Copyright © 2020-2023  润新知