AtCoder Beginner Contest 260 メモ(A-D)
今回の結果
3AC
D問題は解けないとしても、C問題までを解く時間を早くなりたい。
特に今回のC問題はそこまで難しい問題ではないので、D問題を解けるか解けないかじゃなくて、
スピードでパフォーマンスを上げることも意識していきたい。
A - A Unique Letter
Difficulty: 12
問題文
長さ
但し、そのような文字が存在しない場合は代わりに -1
と出力してください。
制約
-
は英小文字のみからなるS 文字の文字列3
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。正解が複数ある場合、どれを出力してもよい。
入出力例
入力例 1
pop
出力例 1
o
入力例 2
abc
出力例 2
a
入力例 3
xxx
出力例 3
-1
参加中に考えたこと
3文字の文字列のパターンは、
- 3文字とも異なる
- 2文字が同じで1文字が他と異なる
- 全て同じ文字
の3通りある。
1.の場合はどの文字を出力してもよくて、2.の場合は重複していない1文字を出力するようにすればよい。
3文字しかないのでそのまま分岐を書く。
B - Better Students Are Needed!
Difficulty: 195
問題文
入学試験の受験者が
試験の結果、
試験の合格者は次のように決められます。
- 数学の点が高い方から
人を合格とする。X - 次に、この時点でまだ合格となっていない受験者のうち、英語の点が高い方から
人を合格とする。Y - 次に、この時点でまだ合格となっていない受験者のうち、数学と英語の合計点が高い方から
人を合格とする。Z - ここまでで合格となっていない受験者は、不合格とする。
ただし、 1. から 3. までのどの段階についても、同点であった場合は受験生の番号の小さい方を優先します。入出力例も参照してください。
以上の手順で合格者を決める時、合格となった受験生の番号を小さい方から順に改行区切りで出力してください。
制約
- 入力は全て整数
1≤N≤1000 0≤X,Y,Z≤N 1≤X+Y+Z≤N 0≤A_i ,B_i ≤100
入力
入力は以下の形式で標準入力から与えられる。
出力
合格となった受験生の番号を小さい方から順に改行区切りで出力せよ。
入出力例
入力例 1
6 1 0 2
80 60 80 60 70 70
40 20 50 90 90 80
出力例 1
1
4
5
入力例 2
5 2 1 2
0 100 0 100 0
0 0 100 100 0
出力例 2
1
2
3
4
5
入力例 3
15 4 3 2
30 65 20 95 100 45 70 85 20 35 95 50 40 15 85
0 25 45 35 65 70 80 90 40 55 20 20 45 75 100
出力例 3
2
4
5
6
7
8
11
14
15
参加中に考えたこと
出力は受験生の番号の昇順という指定があるので、合格者はsetで持たせて範囲forで出力させた。
C - Changing Jewels
Difficulty: 413
問題文
高橋君はレベル
高橋君は次の操作を好きなだけ行うことができます。
- レベル
の赤い宝石 (n はn 以上) を「レベル2 の赤い宝石n−1 個と、レベル1 の青い宝石n 個」に変換する。X - レベル
の青い宝石 (n はn 以上) を「レベル2 の赤い宝石n−1 個と、レベル1 の青い宝石n−1 個」に変換する。Y
高橋君はレベル
制約
1≤N≤10 1≤X≤5 1≤Y≤5 - 入力される値はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
出力
答えを出力せよ。
入出力例
入力例 1
2 3 4
出力例 1
12
入力例 2
1 5 5
出力例 2
0
入力例 3
10 5 5
出力例 3
3942349900
参加中に考えたこと
いかにもDFS使って解いてくださいと言わんばかりの問題だと思えた。
赤・青の2種類の宝石があるので、それをどういうかたちで再帰にするかで悩む。
結局、引数にはレベルだけ持たせて、他はグローバルで持っておくようにした。
考察・感想
DPでも解く方法もあったか。
解き方を考えているときに少しよぎったけど、問題文の流れでDFSのほうがやりやすそうと思ってDFSで解いた。
慣れてるほうで解けばいいと思うけど、DPのほうが簡単に解けたかな。。
D - Draw Your Cards
Difficulty: 1074
問題文
この山札を使って、以下の行動を
- 山札の一番上のカードを引いて、そこに書かれた整数を
とする。X - 場に見えている表向きのカードであって書かれた整数が
以上であるもののうち、書かれた整数が最小のものの上に、引いたカードを表向きで重ねる。もし場にそのようなカードがなければ、引いたカードをどれにも重ねずに表向きで場に置く。X - その後、表向きのカードが
枚重ねられた山が場にあればその山のカードを全て食べる。食べられたカードは全て場から消滅する。K
各カードについて、何ターン目に食べられるか、あるいは最後まで食べられないかを求めてください。
制約
- 入力は全て整数
1≤K≤N≤2×10^5 -
はP の順列 ((1,2,…,N) を並べ替えて得られる列 ) である(1,2,…,N)
入力
入力は以下の形式で標準入力から与えられる。
出力
そのうち
- もし
が書かれたカードが食べられるなら、それが何ターン目であるかを整数として出力せよ。i - そうでないなら
と出力せよ。−1
入出力例
入力例 1
5 2
3 5 2 1 4
出力例 1
4
3
3
-1
4
入力例 2
5 1
1 2 3 4 5
出力例 2
1
2
3
4
5
入力例 3
15 3
3 14 15 9 2 6 5 13 1 7 10 11 8 12 4
出力例 3
9
9
9
15
15
6
-1
-1
6
-1
-1
-1
-1
6
15
参加中に考えたこと
問題文の手順の2点目の、「
ただ、データをどう持たせるのがいいのかが分からなくて実装ができずに終了。
考察・感想
Difficulty 1000超えは解いたことがほとんどないけど後日チャレンジしてみた。
いろいろ考えたが結局解けず、解説を見てみるがそれでも分からないところが多い。
実装スキルが求められる問題だと感じた。
データの持たせ方としてはmapを使って持たせることにした。キーが表向きのカード、値にその山のカードの配列となるようにして。二分探索すればカードをどの山の上に置くかを決められる。
(解説の2つ目と同じ解き方)
これで必要な行動ができるだろうと思って提出すると1つのケースだけTLEする。。
何が原因なのかを調べると、これも解説にあった通りでキーを割り当て直す際に配列のコピーをすると計算量が悪化するというのが原因だった。moveについて調べるとムーブ セマンティクスというキーワードが見つかって、右辺値、左辺値など知らなかった言葉も多くあって、調べながらコードを書き替えてようやくACすることができた。
解説1のように配列を別々に用意すればこの点では躓くことはない。
Discussion