信奧賽CSP-J復賽集訓(模擬算法專題)(3):P1089 [NOIP 2004 提高組] 津津的儲蓄計劃
題目描述
津津的零花錢一直都是自己管理。每個月的月初媽媽給津津 300 300 300 元錢,津津會預算這個月的花銷,并且總能做到實際花銷和預算的相同。
為了讓津津學習如何儲蓄,媽媽提出,津津可以隨時把整百的錢存在她那里,到了年末她會加上 20 % 20\% 20% 還給津津。因此津津制定了一個儲蓄計劃:每個月的月初,在得到媽媽給的零花錢后,如果她預計到這個月的月末手中還會有多于 100 100 100 元或恰好 100 100 100 元,她就會把整百的錢存在媽媽那里,剩余的錢留在自己手中。
例如 11 11 11月初津津手中還有 83 83 83 元,媽媽給了津津 300 300 300 元。津津預計 11 11 11月的花銷是 180 180 180 元,那么她就會在媽媽那里存 200 200 200 元,自己留下 183 183 183 元。到了 11 11 11 月月末,津津手中會剩下 3 3 3 元錢。
津津發現這個儲蓄計劃的主要風險是,存在媽媽那里的錢在年末之前不能取出。有可能在某個月的月初,津津手中的錢加上這個月媽媽給的錢,不夠這個月的原定預算。如果出現這種情況,津津將不得不在這個月省吃儉用,壓縮預算。
現在請你根據 2004 2004 2004 年 1 1 1 月到 12 12 12 月每個月津津的預算,判斷會不會出現這種情況。如果不會,計算到 2004 2004 2004 年年末,媽媽將津津平常存的錢加上 20 % 20\% 20% 還給津津之后,津津手中會有多少錢。
輸入格式
12 12 12 行數據,每行包含一個小于 350 350 350 的非負整數,分別表示 1 1 1 月到 12 12 12 月津津的預算。
輸出格式
一個整數。如果儲蓄計劃實施過程中出現某個月錢不夠用的情況,輸出 ? X -X ?X, X X X 表示出現這種情況的第一個月;否則輸出到 2004 2004 2004 年年末津津手中會有多少錢。
注意,洛谷不需要進行文件輸入輸出,而是標準輸入輸出。
輸入輸出樣例 #1
輸入 #1
290
230
280
200
300
170
340
50
90
80
200
60
輸出 #1
-7
輸入輸出樣例 #2
輸入 #2
290
230
280
200
300
170
330
50
90
80
200
60
輸出 #2
1580
AC代碼:
#include<bits/stdc++.h>
using namespace std;int x; // 每個月的開銷
int y; // 上個月剩余的錢(未存入媽媽賬戶的零錢)
int ans; // 累計存入媽媽那里的錢(整百存儲)int main() {for (int i = 1; i <= 12; i++) { // 處理12個月的數據cin >> x; // 輸入當前月的開銷// 檢查上個月剩余的錢(y) + 本月300元是否不足以支付本月開銷if (y + 300 < x) {cout << "-" << i; // 不足則輸出當前月份并結束程序return 0;}// 計算當前月能存多少整百的錢// (y + 300 - x)是總剩余,整除100得到整百的數量int q1 = (y + 300 - x) / 100;if (q1 > 0) { // 如果存在可存的整百金額ans += q1 * 100; // 將整百的錢存入媽媽那里}// 更新本月剩余的錢:總剩余(y+300-x)減去存的錢(q1*100)// 等價于取模100,保留零錢部分y = (y + 300 - x) % 100;}// 輸出最終結果:剩余零錢(y) + 存款與利息(ans * 1.2)// 注意:ans是整百總和,利息為20%,所以總金額為 ans*1.2 + ycout << y + ans * 1.2;return 0;
}
代碼功能分析:
-
變量說明:
x
:記錄每個月的開銷。y
:存儲上個月剩余的零錢(未存入媽媽賬戶的部分)。ans
:累計存入媽媽賬戶的整百金額總和。
-
循環處理每月數據:
- 遍歷12個月,逐月輸入開銷
x
。 - 資金不足判斷:若上個月剩余的錢
y
加上本月300元不足以支付本月開銷,直接輸出負的當前月份并終止程序。
- 遍歷12個月,逐月輸入開銷
-
存款計算:
- 計算本月總剩余資金
(y + 300 - x)
。 - 將總剩余資金中整百的部分存入媽媽賬戶(
q1 * 100
),并更新累計存款ans
。 - 剩余零錢更新為總剩余資金對100取模的結果,即
y = (y + 300 - x) % 100
。
- 計算本月總剩余資金
-
年終結算:
- 輸出最終總金額,包括媽媽賬戶中的本金與20%利息(
ans * 1.2
)以及手中剩余的零錢y
。
- 輸出最終總金額,包括媽媽賬戶中的本金與20%利息(
關鍵邏輯驗證:
- 資金不足判定:正確判斷當月是否會出現赤字,確保及時輸出錯誤月份。
- 整百存款計算:通過整除和取模操作精確處理存款與零錢,避免誤差。
- 利息計算:整百存款的20%利息通過
ans * 1.2
正確實現,與剩余零錢相加得到最終結果。
文末彩蛋:
關注并查看老師的個人主頁,學習完整csp信奧賽完整系列課程: https://edu.csdn.net/lecturer/7901