読者です 読者をやめる 読者になる 読者になる

メモ

yukicoderで遊んでいる競プロゆるふわ勢

yukicoder No.126 2基のエレベータ

問題はこちら
No.126 2基のエレベータ - yukicoder

場合分けを丁寧にしないとありとあらゆるケースが殺しに来る
k:=abs(s-a)、t:=abs(s-b)とする
○k<=tのとき
Aが来るのでそのまま地下1階に降りることができる
○k>tのとき
sが1ならこの場合でもAが来る
そうでない時はBがやってくる。この後の行動は2通り考えられ
・1階まで降りた後エレベーターAを呼ぶ
・エレベーターAのある階に移動して乗り換える
ただし後者の選択肢はAが地下1階にあるときは選べない

以上をまとめると
k<=t or s==1 のとき k+s
そうでなくa!=0のとき t+a+min(s-1,k)
さもなくば t+s-1+2
(2つ目は「BがS階に来るまでt」+「Aが地下1階に行くまでa」+「Bで1階までorAのある階まで」)

int main(){
	int a,b,s,k,t;
	scanf("%d%d%d",&a,&b,&s);
	k=abs(s-a);
	t=abs(s-b);
	if(k<=t||s==1)printf("%d",k+s);
	else if(a!=0)printf("%d",t+a+(s-1<k?s-1:k));
	else printf("%d",t+s+1);
	return 0;
}

2つ目はt+a+(k<s-1?k:s-1)
3つ目はt+a+(s-1+2)
とよく似ているのでこれをまとめたい
3つ目になるのはaが0のときだから、この時k=sとなっていることを踏まえぐっと睨むと
t+a+(k<s?k:s-1+2*!a)
とまとめられることが分かる

k,t,s,a;main(b){k=scanf("%d%d%d",&a,&b,&s)<printf("%d",(k=abs(s-a))>(t=abs(s-b))&s>1?t+a+(s>k?k:s-1+2*!a):k+s);}

112B