bacon_egg @ ウィキ コリンク-Make Purse Light

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

/*
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;
}