パソコン甲子園(2011年予選問題第2問)
前回に引き続いてパソコン甲子園(2011年予選問題第2問)を解いてみます。
入力データ
複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。各データセットは以下のとおりです。
1 行目 お菓子の数 n(整数)
2 行目 第 1 のお菓子の情報 i p q r(整数 整数 整数 整数;半角空白区切り)
3 行目 第 2 のお菓子の情報
:
n+1 番目 第 n のお菓子の情報
n+2 番目 各栄養素及びカロリーの制限値 P Q R C(整数 整数 整数 整数;半角空白区切り)
出力
入力データセットごとに、食べてもよいお菓子の番号または”NA”を出力します。
※問題の詳細は下記から見てください。
パソコン甲子園
以下ソース
# 2.awk # usage : gawk -f 2.awk 2.txt # { if($0 == 0){ exit; } if(set == 0){ n = $0; # お菓子の数 set = 1; num = 0; ans = 0; }else if(set == 1){ if(n > 0){ # お菓子がまだ残っているなら i[num] = $1; # お菓子の番号 p[num] = $2; # たんぱく質の重量 q[num] = $3; # 脂質の重量 r[num] = $4; # 炭水化物の重量 c[num] = p[num] * 4 + q[num] * 4 + r[num] * 9; n--; # お菓子の数を減らす num++; }else{ # お菓子が残っていないなら max_p = $1; max_q = $2; max_r = $3; max_c = $4; for(x = 0;x < num;x++){ if((p[x] < max_p) && (q[x] < max_q) && (r[x] <max_r) && (c[num] < max_c)){ print i[x]; ans = 1; } } if(ans == 0){ print "NA"; } set = 0; num = 0; ans = 0; } } }
入力データ
4
1 7 14 47
2 5 35 55
3 6 3 59
4 6 5 15
10 15 50 400
2
1 8 10 78
2 4 18 33
10 10 50 300
0
実行してみる
無事に動いている
gawk -f 2.awk 2.txt
1
4
NA