0.はじめに
最近ARCの高レート化とかあったので、ABCにレベルの調整が入ったのか
Bはやや難しく、Cは以前のBとCの間位、Dは以前のC位の難易度になった気がします。
ということで、今回もDまでは難なくAC。
E以降は、難しく解説を見てもちょっと分からない感じでした・・・。
レートは順調に+11で798と、緑までほんとにあと一歩となりました。
1.A - Poisonous Oyster
各牡蠣の状態(o正常、x痛んでる)と、青木君、高橋君の状態は以下。
1234 高橋 青木
xooo sick sick
oxoo sick fine
ooxo fine sick
ooox fine fine
あとは、入力したS1とS2の状態から、痛んでる牡蠣の番号を判断し
出力して終了
https://atcoder.jp/contests/abc393/submissions/62756299
2.B - A..B..C
こういう時は、Bを固定してAとCを調べると聞いた気がしますが
まぁ、そこまで制限は厳しくないのでAを起点に考えました。
【考え方】
・Sを先頭から見ていく
・S[i]がAの時、以下のループを、”i+ループ回数×2”がSの長さを超えるまで繰り返す
・S[i+ループ回数]=B、S[i+ループ回数*2]=Cの時、回答用変数に1を加算
・最後に回答用変数を出力して終了
https://atcoder.jp/contests/abc393/submissions/62771624
3.C - Make it Simple
経路問題かと思いきや、単純な問題でした。
【考え方】
・辺の中から除外する条件は以下
・始点と終点が同じ(自己ループ)
・各辺の小さい方を始点、大きい方を終点とした場合
同一の辺がある辺(多重辺)
・辺をチェックしていき、上記条件に合う辺の数を数えて最後に出力
https://atcoder.jp/contests/abc393/submissions/62775595
4.D - Swap to Gather
【考え方】
・ある1を起点として左右の1を寄せた場合の操作数をそれぞれ求め一番小さい操作数を求める
1.前から見ていき、各1までその前までの1を移動してきた場合の操作数を求める。
2.後ろから見ていき、各1までその後ろの1を移動してきた場合の操作数を求める。
3.各1毎の1と2で求めた値を足した値がその1まで前後の1を移動させてきた場合の操作数となる
【実装】
1.文字列の長さNと、文字列Sをインプット
2.以下変数を定義
X:始点から現在の位置までの1の数
Y:前の1から現在の位置までの0の数
Z:前の1までの操作数
L:文字列Sのi文字目の1まで左側の1を詰めた場合の操作数リスト[0]×Nで初期化
R:文字列Sのi文字目の1まで右側の1を詰めた場合の操作数リスト[0]×Nで初期化
ans:回答する最小操作数。Nの5条で初期化
3.以下N回ループ(index:i):Sを左からチェックしていき、その1までの1をすべて詰めるのに必要な操作数を計算
-1.S[i]が1の時
-1.L[i]にZ+(XY))をセット
-2.Xに1加算
-3.Yに0をセット
-4.ZにL[i]をセット
-2.S[i]が0の時
-5.Yに1加算
4.XYZを初期化
5.以下N回ループ(index:i):Sを右からチェックしていき、その1までの1をすべて詰めるのに必要な操作数を計算
-1.S[N-1-i]が1の時
-1.L[N-1-i]にZ+(XY))をセット
-2.Xに1加算
-3.Yに0をセット
-4.ZにL[N-1-i]をセット
-2.S[N-1-i]が0の時
-5.Yに1加算
6.以下N回ループ(index:i):Sを右からチェックしていき、1の時その1に左右の1を集約した場合の操作数を計算
-1.S[i]が1の時
-1.ansに、ansとL[i]+R[i]の小さい方をセット
7.ansを出力して終了
https://atcoder.jp/contests/abc393/submissions/62796810
以上