ログイン
編集不可のページディスカッション情報添付ファイル
"iz/競技プログラミング/PKU 3045 Cow Acrobats"の差分

MMA
2と3のリビジョン間の差分
2012-12-04 17:24:44時点のリビジョン2
サイズ: 1185
編集者: iz
コメント:
2012-12-04 17:28:07時点のリビジョン3
サイズ: 1199
編集者: iz
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 6: 行 6:
行 19: 行 20:
max(-S1, -S2 + W1) < max(-S2, -S1 + W2)ならC1を下に すればいい。同じならどっちでもいい。 max(-S1, -S2 + W1) < max(-S2, -S1 + W2)ならC1を下にすればいい。同じならどっちでもいい。
行 25: 行 26:
max(-S1, -S2 + W1) = -S1 max(-S2, -S1 + W2) = -S2 が同時に成立せず、 max(-S1, -S2 + W1) = -S1
行 27: 行 28:
-S1 >= -S1 + W2 * -S2 >= -S2 + W1 は常に成立するから。 max(-S2, -S1 + W2) = -S2

が同時に成立せず、

-S1 >= -S1 + W2

-S2 >= -S2 + W1

は常に成立するから。

http://poj.org/problem?id=3045

50000匹の牛がピラミッド作って喜ぶ問題。どんな牛だよ。

特殊な比較関数用意でソートして貪欲に解いた。 なんか二分探索って話を師匠も工房の先生もしていたのだが・・・

二匹の牛について最大のリスクmaxRiskが最小になるような並べ方を考える。

牛C1のStrengthをS1, WeightをW1 牛C2のStrengthをS1, WeightをW2として

1. C1をC2の上に乗っけるとき maxRisk = max(-S1, -S2 + W1)

2. C2をC1の上に乗っけるとき maxRisk = max(-S2, -S1 + W2)

よって

max(-S1, -S2 + W1) > max(-S2, -S1 + W2)ならC2を下に

max(-S1, -S2 + W1) < max(-S2, -S1 + W2)ならC1を下にすればいい。同じならどっちでもいい。

ところでこれは-S2+W1と-S1+W2を比較するだけでいい。

なぜならS1, S2, W1, W2が正整数であるため

max(-S1, -S2 + W1) = -S1

max(-S2, -S1 + W2) = -S2

が同時に成立せず、

-S1 >= -S1 + W2

-S2 >= -S2 + W1

は常に成立するから。

任意の二匹についてこの並べ方を適用できるのでこれを比較関数にしてソートする。

iz/競技プログラミング/PKU 3045 Cow Acrobats (最終更新日時 2012-12-17 17:25:09 更新者 iz)