洛谷[NOIP2015 普及組] 金幣

Tomorrowland_D發表於2024-07-23

[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;
}

相關文章