HDU2021 發工資咯:)【入門】
阿新 • • 發佈:2019-01-05
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 70126 Accepted Submission(s): 37387
Problem Description 作為杭電的老師,最盼望的日子就是每月的8號了,因為這一天是發工資的日子,養家餬口就靠它了,呵呵
但是對於學校財務處的工作人員來說,這一天則是很忙碌的一天,財務處的小胡老師最近就在考慮一個問題:如果每個老師的工資額都知道,最少需要準備多少張人民幣,才能在給每位老師發工資的時候都不用老師找零呢?
這裡假設老師的工資都是正整數,單位元,人民幣一共有100元、50元、10元、5元、2元和1元六種。
Input 輸入資料包含多個測試例項,每個測試例項的第一行是一個整數n(n<100),表示老師的人數,然後是n個老師的工資。
n=0表示輸入的結束,不做處理。
Output 對於每個測試例項輸出一個整數x,表示至少需要準備的人民幣張數。每個輸出佔一行。
Sample Input 3 1 2 3 0
Sample Output 4
Author lcy
Source
Total Submission(s): 70126 Accepted Submission(s): 37387
Problem Description 作為杭電的老師,最盼望的日子就是每月的8號了,因為這一天是發工資的日子,養家餬口就靠它了,呵呵
但是對於學校財務處的工作人員來說,這一天則是很忙碌的一天,財務處的小胡老師最近就在考慮一個問題:如果每個老師的工資額都知道,最少需要準備多少張人民幣,才能在給每位老師發工資的時候都不用老師找零呢?
這裡假設老師的工資都是正整數,單位元,人民幣一共有100元、50元、10元、5元、2元和1元六種。
Input 輸入資料包含多個測試例項,每個測試例項的第一行是一個整數n(n<100),表示老師的人數,然後是n個老師的工資。
n=0表示輸入的結束,不做處理。
Output 對於每個測試例項輸出一個整數x,表示至少需要準備的人民幣張數。每個輸出佔一行。
Sample Input 3 1 2 3 0
Sample Output 4
Author lcy
Source
問題簡述 :(略)
問題分析:
有點像貪心演算法的地方,實際上要簡單很多。儘可能用大面值幣種發工資是常識。用貪心演算法來做則需要先將幣值從大到小排序,由於幣值陣列是人為設定的,就省去排序了。
對於每一個工資值,用幣值從大到小處就是需要的張數。看著程式應該是可以理解的。
其他的就是資料輸入格式,資料輸出格式,程式書寫格式的問題,相對都簡單了。
程式說明:
把程式寫的具有通用性,是需要一些技巧的,使用陣列來存放幣值也應該算是一種。如果貨幣的面值發生變化,這個程式只需要修改幣值陣列bill[]即可,不需要修改程式邏輯,可以說通用性非常強。這依賴於變數billcount初始值能夠自動算出該陣列元素的個數。
使用什麼樣的資料結構來儲存資料,多多少少會一定程度影響程式的邏輯,需要注意的是簡潔為佳。
用迴圈處理,程式邏輯要簡單一些。
AC的C語言程式如下:
/* HDU2021 發工資咯:) */ #include <stdio.h> int main(void) { int bill[] = {100, 50, 10, 5, 2, 1}; int billcount = sizeof(bill) / sizeof(int); int n, count, val, i, j; while(scanf("%d", &n) != EOF) { // 判斷結束條件 if(n == 0) break; // 張數清零 count = 0; // 讀入工資進行處理 for(i=1; i<=n; i++) { scanf("%d", &val); for(j=0; j<billcount; j++) { if(val == 0) break; count += val / bill[j]; val %= bill[j]; } } // 輸出結果 printf("%d\n", count); } return 0; }