• Vijos P1974 金币【数列】


    描述

    国王将金币作为工资,发放给忠诚的骑士。
    第一天骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天,每天收到四枚金币,以此类推;这种工资发放模式会一直延续下去,当连续N天收到N枚金币后,骑士会在之后的N+1天,每天收到N+1枚金币。

    请计算前K天里,骑士一共获得了多少金币。

    格式

    输入格式

    输入包含一个正整数K,表示发放金币的天数。

    输出格式

    输出一个正整数,即骑士收到的金币数。

    样例1

    样例输入1

    6
    

    样例输出1

    14
    

    样例2

    样例输入2

    1000
    

    样例输出2

    29820
    

    限制

    对于全部数据,1≤K≤100001le Kle 100001K10000

    提示

    对于样例一,骑士一共收到1+2+2+3+3+3=14枚金币。

    来源

    NOIP 2015 普及组 第一题
    数据由AHdoc生成


    问题链接Vijos P1974 金币

    问题分析

    这个问题可以使用模拟计算来解决。

    该问题与《UVALive3045 POJ2000 ZOJ2345 Gold Coins》可以说是同一个问题,只是输入和计算要求略有不同而已。

    原来是打表,这次把打表函数改为递推计算函数。

    关键在于计算快速快,计算逻辑易懂。

    程序说明

    (略)

    题记

    把功能封装到函数中是一个好主意。


    参考链接UVALive3045 POJ2000 ZOJ2345 Gold Coins


    AC的C++程序如下:

    #include <iostream>
    
    using namespace std;
    
    int goldCoins(int n)
    {
        int gc1, gc2=0, i, j, k;
    
        j = 1;  /* Ai, S=1,2,2,3,3,3,4,4,4,4,...... */
        k = 1;  /* 同值计数变量:j值够j个(用k来计数, k=j时)则j增1 */
        gc1 = 0;
        for (i=1; i<=n; i++) {
            gc2 = j + gc1;
            if (k == j){
                j++;
                k = 0;
            }
            k++;
    
            gc1 = gc2;
        }
    
        return gc2;
    }
    
    int main()
    {
        int k;
    
        cin >> k;
    
        cout << goldCoins(k) << endl;
    
        return 0;
    }







  • 相关阅读:
    SQL SERVER或oracl如何判断删除列
    shell date获取时间值
    Zabbix 企业Nginx监控
    Nginx 初探
    Css 基础学习
    jQuery 基础学习
    私有云Mariadb集群搭建
    私有云Rabbitmq 集群部署
    SaltStack Job管理
    Zabbix 监控rabbitmq
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563823.html
Copyright © 2020-2023  润新知