ZeroJudge C164: 金幣

國王將金幣作為工資,發放給忠誠的騎士。第一天,騎士收到一枚金幣;之後兩天 (第二天和第三天),每天收到兩枚金幣;之後三天 (第四、五、六天),每天收到三枚金幣;之後四天(第七、八、九、十天),每天收到四枚金幣 ……;這種工資發放模式會一直這樣延續下去:當連續 N 天每天收到 N 枚金幣後,騎士會在之後的連續 N+1 天裡,每天收到 N+1 枚金幣。

請計算在前 K 天裡,騎士一共獲得了多少金幣。

範例測資

範例輸入範例輸出
輸入文件只有1行,包含一個正整數 K,表示發放金幣的天數。輸出文件只有 1 行,包含一個正整數,即騎士收到的金幣數。
614
100029820

解題思路

可以先將每一天會發放的金幣數量紀錄起來。跑一個 For迴圈 從 0 到 1000000,在迴圈外面宣告一個 count 變數預設為 1,代表發放的金幣數量。在迴圈中再跑一個 For迴圈 從 0 到 count – 1,並將 count 進行 Push_Back 至一個 Vector 中。Push_Back 的迴圈結束後要將最外層的 For迴圈的 i += count,並且將 count++。

跑一個 For迴圈 從 0 到 K-1,並且宣告一個 ans 變數預設為 0,每一次進迴圈都將 ans += 剛剛宣告的 Vector 的第 i 個位置。

範例程式碼-ZeroJudge C164: 金幣

#include <iostream>
#include <vector>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    int N, count = 1, ans = 0;
    cin >> N;
    vector<int>num;
    for (int i = 0; i<1000000; i++) {
        for (int j = 0; j<count; j++) num.push_back(count);
        i += count;
        count++;
    }
    for (int i = 0; i<N; i++) ans += num[i];
    cout << ans << "\n";
}

//ZeroJudge C164
//Dr. SeanXD

發佈留言