• toc {:toc}

문제

μš°ν˜„μ΄λŠ” μ–΄λ¦° μ‹œμ ˆ, 지ꡬ μ™Έμ˜ λ‹€λ₯Έ ν–‰μ„±μ—μ„œλ„ 인λ₯˜λ“€μ΄ μ‚΄μ•„κ°ˆ 수 μžˆλŠ” λ―Έλž˜κ°€ 였리라 λ―Ώμ—ˆλ‹€. 그리고 κ·Έκ°€ μ§€κ΅¬λΌλŠ” 세상에 λ°œμ„ λ‚΄λ € 놓은 μ§€ 23년이 μ§€λ‚œ μ§€κΈˆ, 세계 μ΅œμ—°μ†Œ ASNA 우주 비행사가 λ˜μ–΄ μƒˆλ‘œμš΄ 세계에 λ°œμ„ λ‚΄λ € λ†“λŠ” μ˜κ΄‘μ˜ μˆœκ°„μ„ 기닀리고 μžˆλ‹€.

κ·Έκ°€ νƒ‘μŠΉν•˜κ²Œ 될 μš°μ£Όμ„ μ€ Alpha CentauriλΌλŠ” μƒˆλ‘œμš΄ 인λ₯˜μ˜ 보금자리λ₯Ό κ°œμ²™ν•˜κΈ° μœ„ν•œΒ λŒ€κ·œλͺ¨ μƒν™œ μœ μ§€ μ‹œμŠ€ν…œμ„ νƒ‘μž¬ν•˜κ³  있기 λ•Œλ¬Έμ—, κ·Έ 크기와 μ§ˆλŸ‰μ΄ μ—„μ²­λ‚œ 이유둜 μ΅œμ‹ κΈ°μˆ λ ₯을 총 λ™μ›ν•˜μ—¬ κ°œλ°œν•œ 곡간이동 μž₯치λ₯Ό νƒ‘μž¬ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ 이 곡간이동 μž₯μΉ˜λŠ” 이동 거리λ₯Ό κΈ‰κ²©ν•˜κ²Œ 늘릴 경우 기계에 μ‹¬κ°ν•œ 결함이 λ°œμƒν•˜λŠ” 단점이 μžˆμ–΄μ„œ, 이전 μž‘λ™μ‹œκΈ°μ— k광년을 μ΄λ™ν•˜μ˜€μ„ λ•ŒλŠ” k-1 , k ν˜Ήμ€ k+1 κ΄‘λ…„λ§Œμ„ λ‹€μ‹œ 이동할 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 이 μž₯치λ₯Ό 처음 μž‘λ™μ‹œν‚¬ 경우 -1 , 0 , 1 광년을 이둠상 이동할 수 μžˆμœΌλ‚˜ 사싀상 음수 ν˜Ήμ€ 0 거리만큼의 이동은 μ˜λ―Έκ°€ μ—†μœΌλ―€λ‘œ 1 광년을 이동할 수 있으며, κ·Έ λ‹€μŒμ—λŠ” 0 , 1 , 2 광년을 이동할 수 μžˆλŠ” 것이닀. ( μ—¬κΈ°μ„œ λ‹€μ‹œ 2광년을 μ΄λ™ν•œλ‹€λ©΄ λ‹€μŒ μ‹œκΈ°μ—” 1, 2, 3 광년을 이동할 수 μžˆλ‹€. )

https://www.acmicpc.net/upload/201003/rlaehdgur.JPG

κΉ€μš°ν˜„μ€ 곡간이동 μž₯치 μž‘λ™μ‹œμ˜ μ—λ„ˆμ§€ μ†Œλͺ¨κ°€ ν¬λ‹€λŠ” 점을 잘 μ•Œκ³  있기 λ•Œλ¬Έμ— xμ§€μ μ—μ„œΒ y지점을 ν–₯ν•΄ μ΅œμ†Œν•œμ˜ μž‘λ™ 횟수둜 μ΄λ™ν•˜λ € ν•œλ‹€. ν•˜μ§€λ§Œ y지점에 λ„μ°©ν•΄μ„œλ„ 곡간 이동μž₯치의 μ•ˆμ „μ„±μ„ μœ„ν•˜μ—¬ y지점에 λ„μ°©ν•˜κΈ° λ°”λ‘œ μ§μ „μ˜ μ΄λ™κ±°λ¦¬λŠ” λ°˜λ“œμ‹œ 1κ΄‘λ…„μœΌλ‘œ ν•˜λ € ν•œλ‹€.

κΉ€μš°ν˜„μ„ μœ„ν•΄ x지점뢀터 μ •ν™•νžˆ yμ§€μ μœΌλ‘œ μ΄λ™ν•˜λŠ”λ° ν•„μš”ν•œ 곡간 이동 μž₯치 μž‘λ™ νšŸμˆ˜μ˜Β μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯

μž…λ ₯의 첫 μ€„μ—λŠ” ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ˜ 개수 Tκ°€ μ£Όμ–΄μ§„λ‹€. 각각의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ ν˜„μž¬ μœ„μΉ˜Β x 와 λͺ©ν‘œ μœ„μΉ˜ y κ°€ μ •μˆ˜λ‘œ μ£Όμ–΄μ§€λ©°, xλŠ” 항상 y보닀 μž‘μ€ 값을 κ°–λŠ”λ‹€. (0 ≀ x < y < 231)

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ xμ§€μ μœΌλ‘œλΆ€ν„° yμ§€μ κΉŒμ§€ μ •ν™•νžˆ λ„λ‹¬ν•˜λŠ”λ° ν•„μš”ν•œ μ΅œμ†Œν•œμ˜Β κ³΅κ°„μ΄λ™ μž₯치 μž‘λ™ 횟수λ₯Ό 좜λ ₯ν•œλ‹€.

좜처 : https://www.acmicpc.net/problem/1011

풀이

  1. κ·œμΉ™μ„± λ¨Όμ € 생각. > 처음 μ‹œμž‘ν•  λ•Œ 1κ΄‘λ…„λ§ŒνΌλ§Œ 갈 수 있고 도착할 λ•Œλ„ 1κ΄‘λ…„λ§ŒνΌλ§Œ 갈 수 μžˆλ‹€. > λŒ€μΉ­μ„±μ΄ μžˆλ‹€κ³  생각함.
  2. λŒ€μΉ­μ μœΌλ‘œ 움직일 λ•Œ λͺ‡ κ°€μ§€ 경우λ₯Ό μƒκ°ν•΄λ³΄λ‹ˆ caseλ₯Ό λΆ„λ₯˜ν•  수 μžˆμ—ˆμŒ.
  3. kκ°€ 1λΆ€ν„° μ‹œμž‘ν•΄μ„œ +1μ”© 증가할 λ•Œ 2(k+1)보닀 거리가 크면 νšŸμˆ˜λŠ” 2λ²ˆμ”© μ¦κ°€ν•˜κ³ , k+1 < D < 2(k+1)이면 2번 μ¦κ°€ν•˜κ³  더 이상 μ΄λ™ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. D < k+1이면 1번 μ¦κ°€ν•˜κ³  더 이상 μ΄λ™ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.
  4. μΌ€μ΄μŠ€ λΆ„λ₯˜λ₯Ό 톡해 문제 ν•΄κ²°
#include <iostream>
 
using namespace std;
 
int main()
{
	int T, num, D, k, x, y;
	cin >> T;
	for(int i=0; i<T; i++)
	{
		cin >> x >> y;
		num = 0;
		k=1;
		D = y - x;
		if(D==1) num = D;
		else
		{
			num += 2;
			while(true)
			{
				if(D-2*k>2*(k+1))
				{
					D -= 2*k;
					num+=2;
					k++;
				}
				else if((k+1<D-2*k)&&(D-2*k<=2*(k+1)))
				{
					num+=2;
					break;
				}
				else
				{
					num+=1;
					break;
				}
			}
		}
		cout << num << endl;
		
	}
	
	return 0;
}