A問題:3ポイントシュート
AtCoder Beginner Contest 188回目
A問題。3ポイントショット。問題文。
バスケットボールの試合が行われており、現在の両チームの得点はX対Yです。
ここで、XのっとイコールYであることが保証されます。
現在劣勢であるチームが3ポイントシュートを1本成功させて優勢に立つことはできますか?
つまり、現在得点が低い側のチームが3点を得た場合、
そのチームの得点が他方のチームの得点より真に高くなるかを判定してください。
3ポイントシュートで逆転できるかどうかですね。
入力例1は3と5、出力例1はイエスなので、
もう比べるif問題とかを書かなくても、これ多分いけますね。
abmapint input.splitで、
print if絶対値を取れないのでabs括弧a-b。
これでどっちが大きかろうとマイナスにはならないです。
マイナス符号が取れて、a-bまたはb-aの状態が出ます。
これが2以下だったら、小なりイコール2以下だったら逆転できます。
エルスの3点以上点差がすでにあったら、
同点にはなってもイエスは出ないので2ポイント以下の状況ですね。
希望があるのは。ということで提出。
ACしたのでB問題いきます。
B問題:ベクトルの内積
B問題。オーソゴナリティ?
オーソ…問題がいない。
2つのn次元ベクトルa、bが与えられます。
aとbの内積が0かどうかを判定してください。
すなわち、a1×b1プラスa2×b2プラスa3×b3…
an×bnイコール0かどうかを判定してください。
nは10万、最大10万なので、これはもうやるだけかな?
内積が0ならイエスを、0でないならノーを。
なんか簡単なやり方ありそうですけどね。
nイコールイントインプット、
aイコールリストのマップイントインプットドットスプリットでコピペしましょう。
bも同じ。
アンスイコール0にしておいて、
4iインレンジnアンスプラスイコールai×bi、
プリントイエス、
ifアンスイコールイコール0、
elseノー。
コードテストしておくか、一応。
出力例1は-36と42でイエス。
出力例2はノー。
出力例3はイエス。
イエスですね。提出します。
ACしたのでC問題いきます。
C問題:トーナメント形式の対決
C問題、ABCトーナメント。
問題文、選手1から選手2のn乗までの2のn乗人の選手がトーナメント形式のプログラミング対決をします。
選手iのレートはaiです。
どの2人の選手のレートも異なり、2人の選手が対戦すると常にレートが高い方が勝ちます。
トーナメント表は完全に分岐の形をしています。
より正確にはこのトーナメントは以下の要領で行われます。
シード席がないってことですね。完全に分岐。
以下の要領で行われます。iイコール1からnについて順に以下のことが行われる。
拡声数j1以上2のn-i以下について、まだ負けたことのない選手のうち2j-1番目に記号の小さい選手と2j番目に番号の小さい選手が対戦する。
順に優勝する、すなわち最後に行われる対戦において負ける選手の番号を求めてください。
nが16のaiが10の9乗。aiはレートだからこれ4分とかで取れそうな気はするが。
入力例1、nは2のaが1、4、2、5。
nの倍、2倍分あるってことか。aの数列数は。
出力例は2。この2は最後に行われる対戦において負ける選手の番号。2番目、インデックス番号で言うと1番目の人。
まず選手1と2、選手3と4がそれぞれ対戦し、レートの代償から選手2と4が勝利します。
次に選手2と選手4が対戦し、選手4が勝利してトーナメントが終了します。
最後の対戦で負けるのは選手2を出力します。
maxnが16ならもうその都度その都度リストを作るっていう手もありじゃない?
とりあえず、nイコールイントのインプットで、aイコールリストマップイントインプットスプリット、さっきのb問題流用しましょう。
でだ。
どうしようかな。
一番最初がちょっと思いつかないな。
2個ごとに分けて、リストの中にもう1個リストを各自作りたいな、トーナメント表で。
スタートとしてsというリストを作っておきましょう。空のリストを作って、
s.appendでリスト括弧、
iかける2にするべきかこれ。
01だと02だからおかしいね。
いいのか。
iかけるイコール2にして、
s.append aiとaiのプラス1でちょっとprint s で確認オーバー。
14と25のリストができてればOK。できてるね、OK。
あとはホワイル。
プリント連sが1より大きい間処理し続けてください。
ちなみにこれ今プリント連sって2になってる?2ですね。
なので結晶線が行われるまで処理をしてください。
どうしたらいいかな。
4文かな。
これもあれだ。あれしたらいいんだ。あれしたらいいんだっていうか。
さっきと同じやり方をすればいいんだけど。
そっか。ではホワイル文の中にも大文字Lというリストを作ってしまいましょう。
空のリストね、毎回リセットされるリスト。毎回リセットされるリスト?
そうだね。
4i in 連sの中で i かけるイコール2にして
l.append s の max s の i 番目と max s の i プラス1番目。
というので次の先頭が行われます。
で、s イコール l のフルコピー。
プリント s を毎回出してもらおうかな。この中で。
リストインデックスアウトオブレンジ。何行目?12行目。
12行目?なんか行数が変なことになってる。
カスタマイズ。分かんねえ。行数戻すのどこでやるんだ?
まあいっか。12行目。l.append max s i ここか。
プリント i でちょっと確認。
プリント i と s 出してもらおうかな。
連 s だから連 s にかけて、連 s マイナス1かな?これでどう?
4号が出た。
プリント。これ min s で出る?
二重リストになってるから出ないか。出ないね。
s の0番目。プリント a ドットインデックス括弧2括弧 s の0番目プラス1。
2。コードテスト2個目は1が出たらオッケー。
1。コードテスト3つ目は2が出たらオッケー。
リストインデックスアウトオブレンジ。
なるほどね。なんで?
プリント i と s。
法文。法文の中で何も変わってない。
そうか。
max si 1234 2 3 0 1 2 3までだから連 s 割る2か?
割る2でどう?出たけど8。
出力量は2が正解なので大間違いですね。
あれ?ていうかちょっと待って。ちょっと待ってこれ。
これさぁ。
あ、そうか。びっくりした。相当して2番目の数字がそれじゃね?って思ったけど違うね。よかった。
でもその考え方いけるな。
半分で区切って右のmaxと左のmaxでより小さい方を取ればいいんだ。
そっちの方がずっと簡単だな。それで横。
全部消します。
nイコールイントのインプット、aイコールリストのマップのイントのインプットドットスプリット。
で、a1イコールmaxのaの
これは0 1 2だからn番目でいいね。aのn番目まで。
で、a2イコールmaxのaのn番目から
で、プリントaドットインデックス
min a1とa2にプラス1したやつ。
プラス1。
出力例3番目が2が出ました。出力例2は1が出たらOK。
出力例1は2が出たらOK。
大丈夫そうかな。コードテストは一応クリアしたので出力というか提出してみます。
和が出た。ダメなんだ。
acが5つ。和が7つ。
サンプルとハンドメイドだけですね。クリアしてるの。ランダムとエクストリームがクリアできてない。
なんでだ?理屈上あってそうだけどな。
解説見てみますか。
c問題。
トーナメントをそのままシミュレートします。
簡単なc++ですね。
やっぱインデックス番号×2×1とかで判定してますね。
準優勝するのは優勝する一番レートが高い選手とは逆側のブロックにいる選手のうち一番レートが高い人です。
こちらは解法1より実装がかなり楽です。
この考え方で組んだつもりだったんですけど。
解答例がc++しかないのでちょっと後でPythonの方を見てみようと思います。
ではまた次回。お疲れ様です。