/*
Problem B: [[Make Purse Light]]
制作時間:2010/4/24 17:01~2010/4/24 17:21 (20分)
作者:コリンク
ID:s7509413
[解き方]
まず素直にincludeなどの定形文を書いた。
硬貨の種類が違っても同じような処理をするだろうから、配列による逐次処理が有効だろうと思った。
で、硬貨には枚数と価値があるから構造体がいいだろうと思った。
後はSAMPLE INPUTに合わせてインタフェースを作り、処理を記述した。
途中で使用する硬貨の枚数を記録する変数も欲しくなり、shiyouメンバを追加した。
難易度は低く感じた。
*/
#include <cstdio>
#define KOUKA_SHURUI 4
#define KOUKA_KACHI {10, 50, 100, 500}
struct kouka_t{
int maisu, /* 硬貨の枚数 */
kachi, /* 硬貨の価値 */
shiyou; /* 使用する硬貨の枚数 */
};
void setKoukaKachi(struct kouka_t *obj){ /* 硬貨の価値を設定 */
int temp[] = KOUKA_KACHI, i;
for(i = 0; i < KOUKA_SHURUI; ++i){
obj[i].kachi = temp[i];
}
return;
}
int main(int argc, char *argv[]){
int pay; /* 支払い代金 */
struct kouka_t kouka[KOUKA_SHURUI]; /* 持っている硬貨 */
int i;
int sum;
bool flagLoopExit;
setKoukaKachi(kouka); /* 硬貨の価値を設定 */
while(true){
scanf("%d", &pay); /* 支払い代金入力 */
if(pay <= 0 || pay % kouka[0].kachi != 0){ break; } /* 0で終了 */
for(i = 0; i < KOUKA_SHURUI; ++i){
scanf("%d", &kouka[i].maisu); /* 硬貨の枚数入力 */
kouka[i].shiyou = 0;
}
/* 価値が低い順から硬貨を追加し、合計を支払い代金以上とする。 */
sum = 0;
flagLoopExit = false;
for(i = 0; i < KOUKA_SHURUI && !flagLoopExit; ++i){
while(kouka[i].maisu > 0){
sum += kouka[i].kachi;
--kouka[i].maisu;
++kouka[i].shiyou;
if(sum >= pay){
flagLoopExit = true;
break;
}
}
if(flagLoopExit){ break; }
}
/* 結果表示 */
for(i = 0; i < KOUKA_SHURUI; ++i){
if(kouka[i].shiyou){
printf("%d %d\n", kouka[i].kachi, kouka[i].shiyou);
}
}
puts("");
}
return 0;
}
急上昇Wikiランキング
急上昇中のWikiランキングです。今注目を集めている話題をチェックしてみよう!
最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!
atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!
最近アクセスの多かったページランキングです。話題のページを見に行こう!