1. 競プロする人
  2. AtCoder Beginner Contest 189
2024-10-17 14:05

AtCoder Beginner Contest 189

AtCoder Beginner Contest 189https://atcoder.jp/contests/abc189↓の提出コードを見ながらの聴取を推奨いたしますA:https://atcoder.jp/contests/abc189/submissions/51929902B(解説模写AC):https://atcoder.jp/contests/abc189/submissions/51930065Atcoderホームページ:https://atcoder.jp/home2・5・11・17・23日更新予定#競技プログラミング #Python #podcast

BGMタイトル: Doghouse 作者: Blue Dot Sessions 楽曲リンク: https://freemusicarchive.org/music/Blue_Dot_Sessions/Warmbody/Doghouse/ ライセンス: CC BY-SA 4.0

サマリー

AtCoder Beginner Contest 189では、スロットマシンの結果が当たりかどうかを判定する方法と、高橋くんが飲んだお酒のアルコール量を計算する問題が紹介されています。特にアルコールの摂取量に関する問題では、誤差を避けるための計算方法に焦点が当たっています。

スロットマシンの判定
AtCoder Beginner Contest 189
A問題 スロット
問題文 あなたはスロットマシーンで遊んでいます。スロットを回した結果は3文字のA大文字C1からC3で表され、これらがすべて同じ文字であるとき当たりです。
当たりかどうか判定してください。入力例1SSS、出力例は当たりなのでWON、勝利ですね。
当たりでないならロストを出力せよ。 ということで
Sイコール
どうしようかな、インプットで
S1イコールSの0番目、S2イコールSの1番目、
S3イコール
Sの、ああいや、いいか。
Sのセットの
リストのインプット
にしたら多分分かれてくれると思うんですけどね。
ちょっと コードテストで試してみましょうか。
SSSでプリントS、S1個だけになるね。OK、じゃあプリント
WON
IF連Sがイコールイコール1だったら
全部同じものなのでWONです。エルス
ロスト 提出していきます。
高橋くんのアルコール計算
ではB問題。アルコール
高橋くんはお酒をN杯飲みました。 I番目に飲んだお酒は量がVIミリリットル、アルコール度数がPIパーセントです。
高橋くんはアルコールの摂取量がXミリリットルを超えると酔っ払います。
高橋くんが酔っ払ったのは何杯目のお酒を飲んでいる時ですか?
ただしN杯全てのお酒を飲んだ後でも酔っ払っていない場合は代わりにマイナス1を出力してください。
NとXが与えられて
Nは何?お酒をN杯。N分アルコールと
アルコール量とアルコールのパーセンテージが与えられると。
NとX。Xが許容量ですね。
マップインとインプットドットスプリット。
4IinレンジN個分
VとP。VとPが与えられます。
マップインとインプットドットスプリット。
高橋くんが酔っ払ったのが何杯目のお酒を飲んでいるか出力してよ。
入力例1。1杯目のお酒には200×100分の5イコール10ミリリットルのアルコールが含まれています。
2杯目のお酒には350×100分の3。
アルコールの摂取量がXミリリットル。
パーセント、小数点表示になっているのがややこしいので、全部×100してみましょうか。
X×イコール100で4IinレンジN。V×P×イコール100。
Vを×100する必要あるのかな。P×イコール100。
で、X-イコールV×P。
で、IF X小なりイコール0だったらプリントIプラス1でエグジット。
法文を普通に抜け終わったらプリントマイナス1でいかがですか。
1、1杯目でアウトになっているな。
200×500。Vは×100しなくていいのかな。
1だな。
アルコール摂取量がXを超えると酔っ払います。
量が、いやだよね、全部×100するべきだから
V×100、P×100、X×100。
プリントV×P×Xでちょっと確認しておきます。
小数点絡まれるとちょっとわかんなくなっちゃうな。
V×100したらもうその時点でXを超えますね。そりゃそうか。
うーん。200×100×とどうなる?
これVは100かけなかったらどうなる?
Xが1500、200×500、うん?わかんなくなってきた。
うーん。一回普通に小数点で考えてみます?
PもVもXも100×をしないまま。
1が出るね。
あ、違うわ。Pは×100ですね。
パーセンテージ表記するなら。マイナス1が出た。
あれ?わかんないな。
Pが5500×200でしょ。
VP変数に1回入れるか。
で、プリントXVP×VP。
P÷100×V500。VPが0になった。
あ、そうか。切り捨てにしちゃってるからですね。
斜線は1個ですね。
うーん。これでもマイナス1になるんだ。
10、10.5。
あ、違うわ。Xマイナスイコールしてないからだ。
XマイナスイコールVP。
2。
入力例2は、出力例は2ですね。
1だね。
アルコールの摂取量がちょうどXの時、高橋くんはまだ酔っ払っていません。
ってことは、0以下か。
0以下じゃない。0未満か。
イコールいらないですね。
if X0未満の時、2が出た。
入力例3はマイナス1。
出ましたね。
なんか昔やったやつでは、こういうパーセンテージ表記って100倍してうんぬんっていうのが
あったので、それをちょっと考えたんですが、
いかんせんうまくいかなかったようで。
とりあえず提出してみます。はい、WAが出ましたね。
多分小数点なので、ちょっとした誤差が生まれてるんだと思います。
解説を見ていきます。
i番目のお先に含まれているアルコールの量は、
Vi×Piを100分の1にした数です。
前から順にこれらの和を計算していき、
初めてXを超えるところを出力すればいいです。
しかし、不動小数点数の演算は一般に誤差を含みます。
例えば、以下の入力の正しい答えは-1ですが、
実装と環境によっては3を出力する場合があります。
だいぶ違いますね。
このような問題を避ける最も簡単な方法は、
整数のみで計算できるよう適切な式変形を行うことです。
これね。
今回の場合、これをどうか判定したいので、
両辺に100をかけ、
Vi×Pi×X×100とすることで整数のみで計算できます。
パイソン例がある。
あー、VとPはいじらなくてよかったんだ。
そうか、パーセンテージがそのままもう整数として、
5%だったら0.05なところを5でそのまま受け取っているから、
それはもう100倍している状態なわけですね。
なるほどなるほど。
これは割と初歩的な感じでしたね。
じゃあこれはこのまま、
Xだけを×イコール100にしたらいいの?
V×P、これでいいのかな?
1回ちょっと提出してみて、ダメだったら精査してみます。
中学数学とかじゃない?これ。
あー、通ったっぽいですね。
はい、Xだけを100倍すればよかったというだけのお話でした。
ちょっとひねった考え方をしようとしすぎましたね。
では今回はここまでにしておきましょう。
また次回。お疲れ様です。
14:05

コメント

スクロール