{ }codelper
累積P0282

毎日読む量が増える読書マラソン

ジウは n 日間の読書マラソンをする。
一日目は a ページ読む。
二日目からは、前の日に読んだページ数に d を足した分だけ読む。
ただし、一日に m ページより多くは読まない。
前の日のページ数に d を足した値が m より大きければ、その日は m ページだけ読む。
一行に a、d、m、n が空白一つずつで区切って与えられる。
n 日間に読んだページ数をすべて足した値を出力せよ。

入力
1 ≤ a ≤ m ≤ 10,000、0 ≤ d ≤ 10,000、1 ≤ n ≤ 100,000(すべて整数)
出力
n 日間に読んだページ数の合計を一行に。
コンマなしの数字だけで書く
例 1 · stdin
10 5 22 5
stdout
89
例 2 · stdin
3 0 3 4
stdout
12
main.py
入力(stdin)

実行すると、これらの行が順に input()・標準入力に渡されます(実行中に入力を求めません)。

$ 準備完了

コードを入力して解くにはパソコンで開いてください。モバイルでは問題と解答を見られます。

ほかの言語では?言語別の解答を見る · 8 言語の解答

累積は、変数を二つループの外で作り(今日読むページ数 pages = a、合計 total = 0)、一周ごとに total += pages で積み上げてから pages を明日の値に変える形です。
+= は 8 言語すべて同じです。
例 1 は 10 + 15 + 20 + 22 + 22 = 89 です。
二つのうち小さい方:Python min(pages + d, m)、JS・TS Math.min、Java Math.min、C# Math.Min、C++ std::min(<algorithm>)、Craykon 数学.小さい方。
C の標準ライブラリには整数用の min がないので、if (pages > m) pages = m; と書きます。
落とし穴は四つ:① 順番を入れ替えて先に増やしてから足すと、一日目の a ページが抜けます。
② 合計を入れる変数をループの中で作ると、一周ごとに 0 に戻ります。
③ 上限 m を忘れると後ろの日が大きくなりすぎます。
④ 日を 1 から数えながら day < n と聞くと、最後の日が抜けます(day <= n にするか、0 から数えて day < n)。
この問題の合計は最大でも 1,000,000,000(十億)なので、Java・C#・C・C++ の int(約 21 億まで)に収まります。
範囲がもっと大きくなれば long(C・C++ は long long)に積み上げる必要があります。

Pythonmain.py · 7 行
a, d, m, n = map(int, input().split())pages = a   # 오늘 읽는 쪽수total = 0   # 지금까지 읽은 쪽수for _ in range(n):    total += pages    pages = min(pages + d, m)  # 내일 읽을 쪽수(m을 넘지 않게)print(total)
JavaScriptmain.js · 8 行
const [a, d, m, n] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);let pages = a; // 오늘 읽는 쪽수let total = 0; // 지금까지 읽은 쪽수for (let day = 1; day <= n; day++) {  total += pages;  pages = Math.min(pages + d, m); // 내일 읽을 쪽수(m을 넘지 않게)}console.log(total);
TypeScriptmain.ts · 9 行
import { readFileSync } from "node:fs";const [a, d, m, n]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);let pages: number = a; // 오늘 읽는 쪽수let total = 0; // 지금까지 읽은 쪽수for (let day = 1; day <= n; day++) {  total += pages;  pages = Math.min(pages + d, m); // 내일 읽을 쪽수(m을 넘지 않게)}console.log(total);
JavaMain.java · 15 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int a = sc.nextInt(), d = sc.nextInt(), m = sc.nextInt(), n = sc.nextInt();        int pages = a;   // 오늘 읽는 쪽수        int total = 0;   // 지금까지 읽은 쪽수(가장 커도 10억이라 int에 담긴다)        for (int day = 1; day <= n; day++) {            total += pages;            pages = Math.min(pages + d, m);  // 내일 읽을 쪽수(m을 넘지 않게)        }        System.out.println(total);    }}
C#Main.cs · 18 行
using System; class Program{    static void Main()    {        string[] parts = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);        int a = int.Parse(parts[0]), d = int.Parse(parts[1]), m = int.Parse(parts[2]), n = int.Parse(parts[3]);        int pages = a;   // 오늘 읽는 쪽수        int total = 0;   // 지금까지 읽은 쪽수(가장 커도 10억이라 int에 담긴다)        for (int day = 1; day <= n; day++)        {            total += pages;            pages = Math.Min(pages + d, m);  // 내일 읽을 쪽수(m을 넘지 않게)        }        Console.WriteLine(total);    }}
C++main.cpp · 14 行
#include <algorithm>#include <iostream> int main() {    int a, d, m, n;    std::cin >> a >> d >> m >> n;    int pages = a;        // 오늘 읽는 쪽수    int total = 0;        // 지금까지 읽은 쪽수(가장 커도 10억이라 int에 담긴다)    for (int day = 1; day <= n; day++) {        total += pages;        pages = std::min(pages + d, m);  // 내일 읽을 쪽수(m을 넘지 않게)    }    std::cout << total << '\n';}
Cmain.c · 15 行
#include <stdio.h> int main(void) {    int a, d, m, n;    if (scanf("%d %d %d %d", &a, &d, &m, &n) != 4) return 0;    int pages = a;        // 오늘 읽는 쪽수    int total = 0;        // 지금까지 읽은 쪽수(가장 커도 10억이라 int에 담긴다)    for (int day = 1; day <= n; day++) {        total += pages;        pages += d;       // 내일 읽을 쪽수        if (pages > m) pages = m;    }    printf("%d\n", total);    return 0;}
Craykonmain.cray · 13 行
수들 = コンソール.数読み();a = 수들[0];d = 수들[1];m = 수들[2];n = 수들[3];pages = a; // 오늘 읽는 쪽수total = 0; // 지금까지 읽은 쪽수繰り返す (day = 1; day <= n; day++){    total += pages;    pages = 数学.小さい方(pages + d, m); // 내일 읽을 쪽수(m을 넘지 않게)}コンソール.書く(total);