1716. 計算力扣銀行的錢
Hercy 想要為購買第一輛車存錢。他 每天 都往力扣銀行里存錢。
最開始,他在周一的時候存入 1?塊錢。從周二到周日,他每天都比前一天多存入 1?塊錢。在接下來每一個周一,他都會比 前一個周一 多存入 1?塊錢。
給你?n?,請你返回在第 n?天結束的時候他在力扣銀行總共存了多少塊錢。
示例 1:輸入:n = 4
輸出:10
解釋:第 4 天后,總額為 1 + 2 + 3 + 4 = 10 。示例 2:輸入:n = 10
輸出:37
解釋:第 10 天后,總額為 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4) = 37 。注意到第二個星期一,Hercy 存入 2 塊錢。示例 3:輸入:n = 20
輸出:96
解釋:第 20 天后,總額為 (1 + 2 + 3 + 4 + 5 + 6 + 7) + (2 + 3 + 4 + 5 + 6 + 7 + 8) + (3 + 4 + 5 + 6 + 7 + 8) = 96 。
提示:
1 <= n <= 1000
解題思路
直接模擬存錢的過程
- 在周一的時候存入 1 塊錢。從周二到周日,每天都比前一天多存入 1 塊錢。
- 下一周的周一需要比上一周的周一存入更多的錢,從周二到周日,還是保持每天都比前一天多存入 1 塊錢的規律
- 直到第n天,返回存入的總和
代碼
class Solution {
public:int totalMoney(int n) {int pre=0,sum=0,cur=0;for (int i = 0; i < n; ++i) {if (i%7==0){pre++;cur=pre;}else cur++;sum+=cur;}return sum;}
};
優化思路
- 對于每一周,一定會存下28元,因為:1+2+3+4+5+6+7=28,所以當有r個完整的一周時,會存下 28 * n 元;
- 從第二周開始,每一周都會比前面一周多7元;
- 第r周,會多存下 7*(1+2+3+…+r-1)元。根據等差數列的求和公式,可推導出:7r(r - 1)/2 元;
- 而最后不能構成完整一周的那幾天也是利用相同的思想,可以拆分為 1+2+…mod 和 r * mod。
class Solution {
public:int totalMoney(int n) {int r=n/7,mod=n%7;return (28 * r)+ (7 * r * (r - 1) / 2)+ (r * mod)+ (mod * (mod + 1) / 2);}
};