パソコン甲子園2011年予選問題3
前回の続きです。パソコン甲子園2011年予選問題3を解いてみます。
いつものようにawkでプログラミングしてみます。
問題3
銀行の数 n、お金を預ける年数 y、各銀行の情報(銀行番号 b、金利の種類 t、年利率 r パーセント)を入力とし、最も元利が高くなる銀行番号を出力するプログラムを作成してください。
ただし n、b はそれぞれ 1 以上50 以下の整数、y は 1 以上 30 以下の整数、r は 1 以上 100 以下の整数とします。
また、金利の種類 t は、単利の場合は 1、複利の場合は 2 で与えられます。
また、最も元利が高くなる銀行は一つだけです。
単利と複利は以下の計算式
単利:元利=元金×(1+年数×年利率÷100)
複利:元利=元金×(1+年利率÷100)^年数(^はべき乗です)
入力
複数のデータセットが入力として与えられます。入力の終わりはゼロひとつで示されます。各データセットは以下の通りです。
1 行目 n (整数)
2 行目 y (整数)
3 行目 第 1 の銀行の情報 b r t (すべて整数 ; 半角空白区切り)
4 行目 第 2 の銀行の情報
:
n+2 行目 第 n の銀行の情報
出力
入力データセットごとに、最も元利が高くなる銀行番号を出力します。
以下ソース
BEGIN{ start = 0; # 初期化 gankin = 10000; # 元金 max = 0; } { if($0 == 0){ exit; } if(start == 0){ n = $0; # 銀行の数 start = 1; }else if(start == 1){ y = $0; start = 2; # お金を預ける年数 }else if(n > 0){ # 銀行情報がある場合 b = $1; # 銀行番号 r = $2; # 年利率 t = $3; # 金利種類 motori = keisan(y,r,t); if(motori > max){ max = motori; max_b = b; } n--; if(n == 0){ print max_b; # 最大金額の銀行番号 start = 0; # 初期化 max = 0; } } } function keisan(y,r,t){ if(t == 1){ # 単利なら money = gankin * (1 + y * r / 100); }else{ # 複利なら money = gankin * (1 + r / 100) ^ y; } return money; }
読み込むデータ
2 8 1 5 2 2 6 1 2 9 1 5 2 2 6 1 0
実行してみると、
2 1
解けた。