kmjp's blog

競技プログラミング参加記です

UnKoder #08 : A. Kunekune

なんとか全完。
https://www.hackerrank.com/contests/unkoder-08/challenges/kunekune

問題

初期状態でプレイヤーは原点にいる。
奇数回目の移動ではX座標を正か負に1、偶数回目の移動ではY座標を正か負に1加えた座標に移動できる。
点(X,Y)に到達するまでの最小移動回数を求めよ。

解法

X,Yの正負は関係ないので、ともに非負になるよう符号を反転しておく。
まず、(min(X,Y),min(X,Y))まで2*min(X,Y)手掛けて移動する。

残りの必要移動量は、X座標かY座標が0である。

  • X座標に必要移動量が残っている場合
    • 以下の順で右に移動していけばいいので、(X*2-(X%2))手かかる。
03478...
12569.
  • Y座標に必要移動量が残っている場合
    • 以下の順で上に移動していけばいいので、Y*2+(Y%2)手かかる。
..
98
67
54
23
10
ll X,Y;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>X>>Y;
	X=abs(X);
	Y=abs(Y);
	ll Z=min(X,Y);
	X-=Z;
	Y-=Z;
	ll ret=2*Z;
	
	if(X>0) ret += X*2-(X%2);
	else if(Y>0) ret+=Y*2+(Y%2);
	cout<<ret<<endl;
}

まとめ

yukicoderだとちょっと難しい★1位?