2008年2月2日土曜日

いい方法が思いつかない。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
情報オリンピック2006年度国内本選@どうかく

nチームの参加しているときに
- Piをチームiの順位
- Siをチームiのスコア
- Rijをチームiとチームjの対戦結果
とすると、

0 < i <= nな任意のiについて 
Pi + Si = n
が成り立つ

これを使うと早く計算できる方法がありそうな気がするのだが・・・。

ちなみにa)の証明自体は帰納法を使う。n+1のテーブルから全勝のチームを除外してnに帰結させればよい。

全部の組み合わせを生成するO(2^n)なやりかたは駄目コードを叩きのめしたいという出題者の思う壺だろう。

よいやりかたじゃないと計算量が採点基準に引っかかるように作られた出題だ。設問3でも正方形を作る4点を選ぶやり方と2点から計算でのこりの候補を絞るやり方では計算量が違いすぎる。前者だと得点できないはず。

・・・・・

解説をよんで納得。やっぱり採点基準は考えられているという読みはあたっていた。
しかし効率のよい解法がエレガントだなぁ。

1 件のコメント:

nori さんのコメント...

メモを見る限り敗因はRijの値を-1, 1にしていたことで、1,0とかにしていれば思いついたかもしれない。

しかしチームiに勝っているチームを返す関数f(i)で順位はきまるのかね・・・。全部のedgeをなめないから極端な話、最初に一位のチームをツモッてしまってそのあとツモッたチームすべてにおいてfが1位になったチームを返してしまうようなケースでは2位が決まらない気が・・・。

解説を読み落としているのだろうが、面白いのでもう少し考えよう。

単純にツモからはずせばいいのかな?

いや、ほかも探索すればいいのか。

P(i)=iなときのi=4からはじめたときに
1,
2,1
3,2,1
4位のチームに対してはこんな感じの出力が出ればOKか。

このままだとO(n^2)だが、f(i)を記憶しておいてつなげばいい。

順位が決定できない場合はP(x)からP(1)にいたる経路が二つあって、その経路上にあるやつらは順位が決まらない。もしくは連結じゃないやつ。