1. 程式人生 > >HDU2021 發工資咯:)【入門】

HDU2021 發工資咯:)【入門】

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

問題簡述

:(略)

問題分析

  有點像貪心演算法的地方,實際上要簡單很多。儘可能用大面值幣種發工資是常識。用貪心演算法來做則需要先將幣值從大到小排序,由於幣值陣列是人為設定的,就省去排序了。

  對於每一個工資值,用幣值從大到小處就是需要的張數。看著程式應該是可以理解的。

  其他的就是資料輸入格式,資料輸出格式,程式書寫格式的問題,相對都簡單了。

程式說明

把程式寫的具有通用性,是需要一些技巧的,使用陣列來存放幣值也應該算是一種。如果貨幣的面值發生變化,這個程式只需要修改幣值陣列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;
}