1. 競プロする人
  2. AtCoder Beginner Contest 343
2024-10-23 21:56

AtCoder Beginner Contest 343

AtCoder Beginner Contest 343https://atcoder.jp/contests/abc343↓の提出コードを見ながらの聴取を推奨いたしますA:https://atcoder.jp/contests/abc343/submissions/51977610B:https://atcoder.jp/contests/abc343/submissions/51977685Atcoderホームページ:https://atcoder.jp/home2・7・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 343では、A問題、B問題、C問題の3つの問題に取り組む。各問題では整数の演算やグラフの探索、数列の解析などが行われ、プログラミングのスキルが試される。問題解決の過程や競技プログラミングの戦略についても解説されている。

A問題の解説
AtCoder Beginner Contest 343
A問題、ロングアンサー。
問題文、0以上9以下の整数ABが与えられます。
0以上9以下の整数であって、AプラスBと等しくないものをいずれか一つ出力してください。
ん?
入力例1は2と5。
Aイコール2、Bイコール5のとき7です。したがって、0、1、2、3、4、5、6、8、9のいずれかを出力すると正解となります。
ん?
Lイコール
0、1、2、3、4、5、6、7、8、9。
Bイコールマップ
イントインプットドットスプリットプリント
LのAプラスBパーセント10でいいんじゃない?
一応コードテストしておきましょうか。
足し算して出てきたものをそのままインデックスにすれば、1個次のやつになるはずなので
必然的に
あれ?
あ、そうか、0スタートしてるから0インデックスのままなんだ。
えーっと、じゃあ
AプラスBプラス1パーセント10。
0、0だったら0以外を出せばいいですね。
はい。
で、一応
9、1にしておいてオーバーしていないかどうかの確認。
はい。
大丈夫そうなので提出しておきます。
はい。
B問題のアプローチ
B問題いきます。
B問題。
エイ、エイジェンシー?
ん?
アド、アドジャセンシーマトリックス。
読めん。
なんじゃこりゃ。
問題文。
N頂点の単純無効グラフGがあり、
グラフの頂点には1からNまでの番号が付けられています。
Gの隣接行列Aが与えられます。
すなわちGはAJイコール1である時、
またその時に限り頂点Iと頂点Jを結ぶ辺を持ちます。
Iイコール1からNについて
頂点Iと直接結ばれている頂点の番号を小順に出力してください。
小さい順ですね。
ただし頂点Iと頂点Jが直接結ばれているとは、
IとJを結ぶ辺が存在することを言います。
何を言っているんだ?
Nが最初に与えられて、
N行文Aの数列が与えられてますね。
なのでとりあえずNイコールイントのインプット、
Aイコールリストのリストインプット、
4なんちゃらインレンジ、Nかな。
これで二重リストでそれぞれ分割できているはず。
ちょっと汚いのでインプット.スプリット。
OKですね。問題は?
入力例1は
頂点1と直接結ばれている頂点は
頂点2,3です。
IJイコール1であるとき
頂点Iと頂点Jを結ぶ辺を持ちます。
頂点1と直接結ばれている頂点は頂点2,3です。
2行目は1,4をこの順に。
3行目は1を、4行目は2を。
あーはいはいはい。
なるほど。承知しました。
ではAを消して4はインレンジ、
Nの
単純に1の場所を聞いているだけなので
Aイコールインプット.スプリット、
ANSイコールからの文字列
いや、からのリストで
for小文字A in for文字A
if小文字Aがイコールイコール文字列
文字1だったら
ANS.append
あ、インデックス数がいるね。
いるので
レンジ
レンラージAですね。
forA inレンジ
レンA
ifAの
smallA番目が1だったら
ANS.append smallAプラス1
で、4文が全部終わったらプリント
アスタリスコアンス
2,3,1,4,1,2OKですね。
問題はからの文字列というか
ゼロゼロのときに何も出力しないでいいときに
からのリストを出しちゃったらダメなので
あ、OKですね。
入力例3
はい、大丈夫そうなので提出していきます。
なんて読むんだろう、エージェン
エージェンシー
エージェンシーでいいのかな。
ACしたのでC問題いきます。
C問題の挑戦
C問題343
問題文。生成数Nが与えられます。
N以下の生成数であって
階分立方数であるものの最大値を求めてください。
ただし生成数Kは以下の2つの条件を満たすとき
そのときに限り階分立方数であると定義します。
ある生成数Xが存在し
Xの3乗はKを満たす。
Kを先頭にゼロをつけず
10進数を表記した文字列が階分となる。
より厳密には
0以上9以下の整数A0から
AのL-2
および1以上9以下の整数AのL-1を用いて
Kイコール
AのI番目かける10のI乗
と表記したときに
あーなんか難しいこと言ってるけど
要は階分出せばいいんですよね。
階分だったらOK。
入力例1は3,4,5。
出力例は3,4,3。
3,4,3は階分立方数であり
3,4,4、3,4,5は階分立方数ではありません。
したがって3,4,3が答えとなります。
入力例2、6。
出力例は1。
入力例3、1,2,3,4,5,6,7,8,9,0,1,2,3,4,5。
出力例3、1,3,3,4,9,9,6,9,9,4,3,3,1。
はい。
n以下の生成数であって
ですね。
nは10の18乗以下なので
4分はちょっと厳しい。
ビットかなぁ。
生成数kは以下の2つの条件を満たす。
ある生成数xが存在し
xの3乗がkを満たす。
え?
xの3乗がkを満たす。
ん?
1個目の条件がちょっとわけわからんな。
xがそこから出てないんですよね。
問題文の中に。
ある生成数xが存在し
x3乗イコールk。
このxはどのx?
どこに対してのx?
何かしらの3乗である
ことを
求めないといけない。
うんうんうんうん。
じゃあ4分でもいけそうだなぁ。
4分の中で
iの3乗3乗3乗ってやっていけば
10の18乗だから
10の6乗までいけるのかな?
6乗って4分いけるんだっけ?
ギリ無理な気するな。
一回やってみてですね。
はい。それでちょっとやっていきましょうか。
あれ?でも
x3乗イコールkを満たす。
まあまあいいね。
いいので
nイコールイントのインプットを
4iインレンジ
いや、ワイルにしようかな。
一緒か。4iインレンジ
n。
if
iかけiかけiが
n以上になったらもうブレーク。
で、4分の前にans0。
えっと
iかけiかけiをあらかじめもう変数にしちゃおう。
i3イコールiかけiかけi。
で、if
i3がn以上、nより大きくなったらブレーク。
if
i3str
イコール
str
i3にして
if
i3strイコールイコール
i3strの反転したやつ。
回分だったら
ansイコール
max
ans
i3str
いや、i3でいいや。
で、プリント
ans
かな?
345の場合343
343
入力例2、6の場合1。
2かける2かける2でもオーバーしちゃうからってことですね。
1。
で、出力例
3つ目がちょっと大きい数字ですが
1、3、3、4、9、9、6、9、9
いけてるね。
入力例はクリアしたんですが
ワンチャンちょっとオーバーしそうですね。提出してみます。
オーバーじゃなくてWAが出ましたね。
ロングアンサー。でも1個だけだな。
1個だけアウトで他はACしてるので
もうあとちょっとって感じですね。もうちょっと考えますか?
何がいけないんだろう?
テストケース。めっちゃでっかい数字入れたとかは書いてないので
どこで、どういう状況で引っかかってるかがわかんないですね。
入力例3は何桁?
1、2、3、4、5、6、7、8、9、10、1、2、3、4、5
10の、10の
え?15畳?
14畳ぐらいかな?
はクリアできているので。
なので大きすぎてアウトっていうことはなさそうかな?
x の 3 畳イコール k を満たす。
あ、そうか。ん?違うか。それはあってるわ。
k を先頭に 0 をつけずに
k を…あ、先頭に 0 をつけずに
受信表記した文字列が解文となる。
0、1以上、9以下の整数。
ん?
なんでだろうなぁ。どこで間違ってるんだろう。
悔しいなぁ。こんだけ
ac できてて1個だけダメっていうのが。
for i in range
i かけ i かけ i
if
代なりにしてるのがいけないのかな?
代なりイコールにしようかな。
if i 3 代なりイコール n
で、ちょっともう一回出してみましょう。
ダメだったらもう解説を見ていこうと思います。
ダメだね。解説を見ます。
n 以下の立方体、立方数は order n の 3 分の 1 乗個しかありません。
3 乗しているのでね。
したがって n 以下の立方数全てに全探索し
受信表記した時に解文になるか判定することで
この問題を解くことができます。
やったんだよなぁ。
やったつもりなんだよなぁ。
bool check c++ですね。
s イコール 2 ストリング
はいはいはい。チェック関数作ってるね。
一旦下見るか。
ans equals 0
for
1
i かけ i かけ i が
n 以下の間
プラスしていきます。
check i かけ i かけ i
string 2 ストリングにして
to begin to end
あー、リバースってそういう感じなんだ c++。
ちょっと厄介ですね。
で bool が true だったら
ans equals i かけ i かけ i
max で取る必要がなかった?
いや絶対違うなぁ。
ans equals i 3
うーん。
もう一回提出してみましょうか。
多分ダメだと思うけど。
int input
for i range
i 3 equals i かけ i かけ i
うーん。
range n プラス 1
にしてみますか?一回。
あれかな?全部 1 だった場合みたいな
ことある?もしかして。
n が 1 じゃない 2 だった場合
なんか 4 分で
オーバーするとかしないとかが
あったりするんじゃないですか?
ダメだね。
うーん。
ちょっと他の方の提出結果を見てみましょうか。
c 問題を python で解いていらっしゃる方は
直近でいらっしゃいましたね。
うーん。なんかちょっとややこしいやり方してるな。
ややこしいというか
パッと見わかんないやり方してるな。
こっちの方も関数使ってる。
いや関数使ってるのがいいんだ。
range
うーん。
ans equal 1
ans equal 1 で最初定義してるのと
あとは range を n プラス 1 とかじゃなくて
1 start の 10 の 6 プラス 1 乗
10 の 6 乗 プラス 1 か。
i × i × i じゃなくて i × × 3 で出ますね。 python だったら。
うーん。他は大体同じような感じだと思うので
もう一回出してみようかな。
なんかどこが違うのかっていうのが
明確にわかんない問題ですね。
個人的に。
ああ、ダメだな。
str にして
うーん。
競技プログラミングの戦略
ちょっとまた他の方のコードを見ておきます。
今回はここまでにしておきましょう。
ではまた次回。お疲れ様です。
21:56

コメント

スクロール