1. 競プロする人
  2. AtCoder Beginner Contest 146
2024-09-06 25:19

AtCoder Beginner Contest 146

AtCoder Beginner Contest 146 https://atcoder.jp/contests/abc146 ↓の提出コードを見ながらの聴取を推奨いたします A:https://atcoder.jp/contests/abc146/submissions/50960761 B:https://atcoder.jp/contests/abc146/submissions/50960866 C(解説模写AC):https://atcoder.jp/contests/abc146/submissions/50961007 Atcoderホームページ:https://atcoder.jp/home 2・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 146のエピソードでは、曜日に基づく問題や文字列の操作に関する課題が解説されています。特に、整数の価格計算や最大値の求め方に焦点が当たっています。参加者は与えられた問題に取り組み、解法を見つける過程が紹介されています。

曜日に関する問題
AtCoder Beginner Contest 146
A問題 Can't wait for holiday
問題文 今日の曜日を表す文字列Sが与えられます。
Sは、サン、マン、チュー、ウェン、チュー、フライ、サタ、まあ、曜日ですね。のいずれかであり、それぞれ日曜日から土曜日を表します。
次の日曜日、かっこ明日以降が何日後か求めてください。
与えられるのは、今日が与えられますと。
なので一旦、さっき言ったサンデー、マンデーっていうのをリスト作ります。
Lイコールからのリストで、コピペしたので、これを一個ずつダブルクオーテーションで囲みます。
はい、で、これをもう一個、かける2にして、
2周させてしまえば、
何日後、いや2周させる必要ないか。
s イコールインプット日曜日、だから、
ファイル、tmp イコール、
s、ん?
いや、いいか。 cnt イコールゼロにして、
ファイル、s、ノットイコール、
sun だったら、
s イコール、
l.index s なんかわかんなくなってきた。
l.index s
プラス1番目に
パーセント6、7か、1,2,3,4,5,6,7、7で割った余りを
入れればいいんじゃない? cnt プラスイコール1。
で、プリント、
cnt ちょっとややこしい解き方してますね多分。
絶対こんな問題でやる
行動じゃない気がする。
入力例1は1、入力例2は7が出たらOK。
あーそうか、えーっと、
もしサンデーのままだったら、
1週間後って出さないといけないから、
cnt if
cnt not equal 0
else 7 でいかがでしょうか。
入力例はクリアしたので提出しておきます。
あーまたパイパイで出してるや、まあいっか。
はい、閉鎖したのでB問題いきます。
文字列の置き換え
B問題、ROTN
ROTN
問題文、A大文字のみからなる文字列Sがあります。
また整数Nが与えられます。
Sの各文字をアルファベット順で
N個5の文字に置き換えた文字列を出力してください。
ただしアルファベット順で
Zの1個後の文字はAとみなします。
Sの文字数は10の4乗なので普通にリストで受け取って
そのまま1個ずつって感じですかね。
Nイコールイントのインプット
Sイコールリストのインプット
for i in range n
で、プリント
Sのi番目
文字列全体をずらしてってことだね。
なので
27文字?26文字?
ABCDEFGHIJKLMNOPQRSTUVWXYZ
26ですね。
Sのi番目を
ORDで括る
ORDSのi番目プラスN
26で割った余りを出す
で、これをさらにCHRで括る
CHR
で、END
イコール
からの文字にしたら
いけるんじゃないですか?
あー全然違うのが出てきたな。
あれ?なんで?
プリントS
文字の入力ができている
CHR
CHR ORD
合ってると思ったんですけどね。
一回ORDからちょっと確認していこうかな。
65、66で
プラスN
はいはい67、68ここまではOKで
CHRで括ったら
CとDが出ましたね。
26で割った余りを出しちゃったらダメなのか?
うーん
あ、そうか。レンジNでやってるのはそもそもダメなんですね。
レンジ
レンエ
レンSですね。
Sの文字数分
かといって
CDZ
ん?
%26の付けどころが
良くない。
N%26 ORDSI番目のN
んーっと
ORDSのI番目プラスNを括って
それ%26かな?
おー四角が出るね。
ていうかこれさっきやったねじゃあ。
んー?
26で割った余り出しちゃダメなんだな。
んーまあ単純
愚直に考えるなら
アルファベットの列を作って
それ割る26みたいなんでやる感じですかね。
もうそっちでいきますか。
α
イコールリストの
えー
これこそできるんじゃない?
CHR
I
FOR I IN RANGE
26
PRINT
α
シンプルに26じゃない気がするなでも。
えー
なので
ORDEの
AからプラスIをCHRしてもらいます。
実行ABCDOKですね。
大文字でアルファベットがZまで出てきましたので
えー
FOR I IN RANGE
ん?
いや
FOR
small s in large s
PRINT
α
ドット
α括弧
αドット
インデックス
small s
プラス
n
パーセント
26
で、ENDイコールからの文字列
CDEZAB
CDEZAB
OKですね。
入力例2は
0なのでそのまま出すのが正解。
はい。
入力例3は13文字移動してます。
nスタートだったらOK。
大丈夫そうですね。
提出していきます。
ACしたので問題C行きましょうか。
整数の価格計算
C問題
by an integer
問題文
高橋くんは整数を1つ買いに整数屋さんに行きました。
整数屋さんには1以上10の9乗以下の整数が売られていて
整数Nを買うためには
A×N
プラスB×DのNNが必要です。
ここでDのNは
Nの受信表記での桁数です。
高橋くんの所持金がXNの時
高橋くんの買うことのできる最も大きい整数を求めてください。
ただし、買うことのできる整数が1つもない場合は0を出力してください。
ABXが与えられます。
ほぉ?
ABX
イコール
マップ
イント
インプット
ドットスプリット
入力例1が1700
出力は9
9の値段は10×9
プラス7×1
イコール97円
これが買うことのできる最大の整数です。
あ、Xが今持っているお金で
A×NB×A
高橋くんの買うことのできる
高橋くんの買うことのできる整数
答えになる整数は
何もないんだね。求めてください。
他の整数の値段の例をいくつか挙げると
10は10×10
プラス7×2で114円
100は10×100
プラス7×3で1021円
12345は10×12345
プラス7×5
はいはいはいはい
ほぉ?
お店に売られている最大の整数を買うことができます。
0
A×N
一旦
IF
X小なり
AプラスB
だったら
EXIT
PRINT
0
うーん全然
パターンが思いつかないですね。
4分で
1個ずつ
大きい順から見ていく
かどうかってとこかな?
1個ずつ見ていく
大きいのから1個ずつ見ていくのが正しいのか
小さい方から順繰りで見ていくのが正しいのか
そもそもこの4分のやり方が正しいのかどうかですよね
9の値段は
A×整数
B×桁数
うーん
X円
X円
10の18乗だもんな
うーんちょっと思いつかないですね
解説見ようかな
C問題
まず整数Nの値段を計算するためにはNの桁数を求める必要があります。
これは
10の形状
小なりイコールN
小なりイコール10の形状プラス1となる整数Kを見つけると
NはKプラス1桁の整数である
標準の関数等を使って一旦文字列に変換し長さを求める
PythonならLENですね
連関数で求められます
しかし1から10の球状
10億まで順番に値段を計算して購入できるかを判定しているのでは時間制限に間に合わない
今回の問題では値段に単調性
大きい整数ほど値段も高いという法則があるので
以下のように二分単策を利用することができます
10億を買うことができるなら10億が答え
まず次は5億が買えるかどうか
この場合買えたら5億以上10億以下
次に5億と10億の間である7億5000
今度は買えなかったとします
この場合買うことのできる最大の整数は5億以上で7億5000万円より小さい
次は5億と7億5000万の間である6億2500万が買えるかどうかを調べます
はいはいはい
このようにすることで1回の答えの範囲が半分ずつになり
30回程度の計算で答えを見つけることができます
二分単策か
完全に頭から抜けてましたね
二分単策のあれは
コードの書き方をちょっと教えてほしいんですが
あった
えっと
X小なりYを満たすならば
Xの値段小なりYの値段を必ず満たす
やって正直にXの境界線がどこにあるかを割り出せばいい
これは二分単策を使おうということで
C++で書かれているので
Pythonに変換して
変換というか翻訳して見ていこうと思います
あー関数使ってらっしゃいますね
っていうか二分単って
関数いるんだ
DEF
二分単にしよう
二分単ABで
LLチェック
引数1個で良さそうですね
二分単
じゃあ
Zにしとこう
toStringLength
Z
イコール
いやZじゃないな文字列ですね
えーっと
X
DXイコール
S
LEN
括弧
STR
括弧
X
さっき言ってた文字数
桁数を判定するやつですね
でリターン
リターン
A×X
プラスB×DX
A×X
プラス
B×DX
OK
NG
ファイルOK
プラスイコール1
法文で大丈夫そうかこれは
どこまで回してるこれは
あ違うわ
法文じゃなくて
そうか二分単作って
ファイル分でやるんですね
えーよいしょ
OKがゼロ
でNGを
途方もない数に
1
10
100
1000万
10万
100万
1000万
1億
10億
1
にしてらっしゃいます
でファイル
OK
プラス1がノットイコールNGだった場合ずーっと回します
OKプラス1ノットイコールNG
の間回します
でどういう風に回すんですか
mid
イコール
OKプラス
括弧
OKプラスNGの
割る2
割る2と言いましたがこれ多分小数点
外した方がいいよね
整数にした方が
いいはず
if
if二分単の
二分単のmidを入れて
これが
小なりイコール
Xだったら
OKイコールmid
elseそうでなければ
NGがmid
で繰り返してくださいのプリント
最後に
OKを出せばいいよって書いてますね
本当?
9
1個目は9OKですね
出力例2
コンテストの問題解決
はXの数字が出ればOK
OKだね
入力例3は0
0
入力例4は
254309
254309
二分単作ってこんな簡単なんだ
簡単って言ったらあれだけど思いつかなかったから
あんまり
でもなんか
単純ですねあACしましたありがとうございます
ではまた次回お疲れ様です
25:19

コメント

スクロール