cafelier のSRM参加記録です。コンテスト中に考えてたことを執拗に全部書き残すとどうなるだろうかという試み本番中にこういうコードが書きたかったなあ、という後で書いた反省コードを書き残す試み
スパムが来たのでしばらくコメント欄をはてなユーザ限定にしています、すみません、
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1005
せっかくなので1000番台をもう一個。
import std.algorithm; import std.conv; import std.range; import std.stdio; import std.string; int solve(int[][] students) { foreach(y, sy; students) foreach(x, me; sy) { if( students[y].minPos().front == me && transversal(students, x).minPos!"a>b"().front == me ) return me; } return 0; } void main() { for(;;) { int n = readln().chomp().to!int(); if( n == 0 ) break; int[][] students; foreach(_; 0..n) students ~= readln().split().map!(to!int).array(); writeln(solve(students)); } }
nが0だと入力が終了、というパターンをreadln()で書くとこういう風になると思います。二次元配列を適当に読み込んで、solve() 関数で解いています。students[y][*] の最小値が自分で、しかも students[*][x] の最大値が自分ならそこを返す、と素直に判定しています。
せっかくなのでつい range を使いまくりながら書いていますが、みんながこんな書き方をしなければいけない、ということはありません。難しすぎてわからん!と思ったら、C や Java の時と変わらず、普通の for 文で普通に回るコードはいつでもDでも動きます。伝統的な書き方をするとこんな感じになります。
int solve(int[][] students) { for(int y=0; y<students.length; ++y) for(int x=0; x<students[y].length; ++x) { int me = students[y][x]; int minYoko = int.max; for(int i=0; i<students[y].length; ++i) minYoko = min(minYoko, students[y][i]); int maxTate = int.min; for(int i=0; i<students.length; ++i) maxTate = max(maxTate, students[i][x]); if( minYoko == me && maxTate == me ) return me; } return 0; }
presented by cafelier/k.inaba under