/* 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; }
atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!
最近アクセスの多かったページランキングです。話題のページを見に行こう!