【深入浅出程序设计竞赛】:级数求和、金币

220 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 25 天,点击查看活动详情

[NOIP2002 普及组] 级数求和

  • 题目描述

已知:Sn=1+12+13++1nS_n= 1+\frac{1}{2}+\frac{1}{3}+…+\frac{1}{n}。显然对于任意一个整数 kk,当 nn 足够大的时候,Sn>kS_n>k

现给出一个整数 kk,要求计算出一个最小的 nn,使得 Sn>kS_n>k

  • 输入格式:一个正整数 kk
  • 输出格式:一个正整数 nn
  • 样例输入
1
  • 样例输出
2
  • 提示

【数据范围】

对于 100%100\% 的数据,1k151\le k \le 15

【题目来源】

NOIP 2002 普及组第一题

  • 分析:

11 开始,取其倒数,然后加入到 SnSn 中,判断 SnSn 是否大于 kk,如果超过了,就跳出循环。

考虑到 nn 足够大,为了得到比较精确的结果,选用 doubledouble 类型计算倒数和累加

  • 代码演示:
#include<iostream>
using namespace std;
int main(){
    int k, ans = 0;
    cin >> k;
    for(double Sn = 0; Sn <= k; ans++, Sn += 1.0/ans);
    cout << ans;
    return 0;
}

[NOIP2015 普及组] 金币

  • 题目背景

NOIP2015 普及组 T1

  • 题目描述

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 nn 天每天收到 nn 枚金币后,骑士会在之后的连续 n+1n+1 天里,每天收到 n+1n+1 枚金币。

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

  • 输入格式

一个正整数 kk,表示发放金币的天数。

  • 输出格式

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

  • 样例输入 #1
6
  • 样例输出 #1
14
  • 样例输入 #2
1000
  • 样例输出 #2
29820
  • 提示

【样例 1 说明】

骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 1+2+2+3+3+3=141+2+2+3+3+3=14 枚金币。

对于 100%100\% 的数据,1k1041\le k\le 10^4

  • 分析:

最简单的思路就是枚举“每轮”金币发放,其中第 i 轮发金币时,每天就发 i 个金币,并且连发 i 天。在每天发金币的时候,记录骑士收到的金币并累加,同时更新天数。直到累加到指定的天数 k 之后,就输出答案。

  • 代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
    int k;
    cin >> k;
    int coin = 0, day = 0;
    for(int i = 1; ; i++) {
        for(int j = 1; j <= i; j++) {
            coin += i;
            day++;
            if(day == k) {
                cout << coin << endl;
                return 0;
            }
        }
    }
    return 0;
}