Official

B - Hammer Editorial by kyopro_friends


この問題は適切に場合分けすることで解くことができます。

一般に場合分けをする必要がある問題では、極力場合分けのケースを減らし、考えることを減らすことが重要です。

この問題では、例えば、常に壁の座標が正となるようにすると場合分けが減り考えやすくなります。

必要なら全体に \(-1\) を掛けることで、壁の座標 \(Y\) は正としてよく、このとき次のような場合分けにより解くことができます。

  • \(X<Y\) なら直接ゴールへ行ける
  • \(X>Y\) ならゴールへ行くためにハンマーを拾う必要がある
    • \(Z>Y\) ならハンマーを拾うことは不可能
    • \(Z<Y\) なら、まず \(Z\) に行きハンマーを拾い、それからゴールの \(X\) に行く

実装例(C)

#include<stdio.h>
#include<stdlib.h>

int main(){
	int x,y,z;
	scanf("%d%d%d",&x,&y,&z);
	
	if(y<0){
		x=-x;
		y=-y;
		z=-z;
	}
	
	if(x<y){
		printf("%d\n",abs(x));
	}else{
		if(z>y){
			puts("-1");
		}else{
			printf("%d\n",abs(z)+abs(x-z));
		}
	}
}

posted:
last update: