問題はこちら
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