[NOIP2015 普及組] 金幣
題目背景
NOIP2015 普及組 T1
題目描述
國王將金幣作為工資,發放給忠誠的騎士。第一天,騎士收到一枚金幣;之後兩天(第二天和第三天),每天收到兩枚金幣;之後三天(第四、五、六天),每天收到三枚金幣;之後四天(第七、八、九、十天),每天收到四枚金幣……;這種工資發放模式會一直這樣延續下去:當連續 n 天每天收到 n 枚金幣後,騎士會在之後的連續 n+1 天裡,每天收到 n+1 枚金幣。
請計算在前 k 天裡,騎士一共獲得了多少金幣。
輸入格式
一個正整數 k,表示發放金幣的天數。
輸出格式
一個正整數,即騎士收到的金幣數。
樣例 #1
樣例輸入 #1
6
樣例輸出 #1
14
樣例 #2
樣例輸入 #2
1000
樣例輸出 #2
29820
提示
【樣例 1 說明】
騎士第一天收到一枚金幣;第二天和第三天,每天收到兩枚金幣;第四、五、六天,每天收到三枚金幣。因此一共收到 1+2+2+3+3+3=14 枚金幣。
對於 100% 的資料,1<k<10^4。
這道題我們可以進行模擬的操作,很顯然,如果用一個陣列來儲存第k天的金幣的話,這個陣列的值為1,2,2,3,3,3,4,4,4,4.....
如果總共是n天的話,我們可以使用雙重迴圈,給陣列賦值,外層迴圈條件為陣列的長度小於n,內層則迴圈k次(k初始化為1),這樣就可以達到上述1,2,2,3,3,3.....這種效果
最後,再遍歷這個陣列,累加陣列中的元素,我們就可以得到答案了
C++程式碼如下:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> result;
int k = 1;
while (result.size()<n) {
for (int i = 1; i <= k; i++) result.push_back(k);
k++;
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += result[i];
}
cout << sum;
return 0;
}