1. ๋ฌธ์ ์ค๋ช ๐
๋ฌธ์
x
์ค์ฌ์ ์์ n๊ฐ์ Thread๊ฐ ์กด์ฌํ๋ค. $T_{i}$๋ผ ๋ถ๋ฆฌ๋ i๋ฒ์งธ Thread์ ๊ธธ์ด๋ $l_{i}$์ ํด๋น Thread์ ์์ ์ง์ ์์น์ธ $x_{i}$๋ก ๋ํ๋ด์ด ์ง๋ค. ๋ ๋ณ์ ๋ชจ๋ Integer ์ด๋ค. ์ฐ๋ฆฌ๋ ๊ฐ๊ฐ์ Thread ๋ง๋ค ๋งค๋ญ์ ์ง๊ณ ์ถ์ด ํ๋ค. ๋งค๋ญ์ ์์น ๋ํ ๋ฐ๋์ Integer์ฌ์ผ ํ๋ค. ๋งค๋ญ์ Thread ์์ ์ด๋ ์ง์ ์์๋ ์๊ด ์์ด ๋ง๋ค์ด์ง ์ ์๊ณ , Thread์ ๊ธธ์ด๊ฐ ๋งค๋ญ์ ์ํด ์ค์ด๋ค์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ค. ๋น์ ์ ๋ํ ์ด๋ ํ Thread๋ ๋ ๋ค๋ฅธ Thread์ ์ํด ์์ ํ ํฌํจ๋์ด์ง์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ค. ์ด๋ค ์๋ฏธ๋๋ฉด, $x_j$ <= $x_i$ ์ด๋ฉด์ $x_i$ + $l_i$<= $x_j + l_j$ ์ธ $T_i$์ $T_j$๋ ์กด์ฌํ์ง ์๋๋ค.
์ฐ๋ฆฌ๋ ๊ฐ์ฅ ๊ฐ๊น๊ฒ ์ธ์ ํ ๋ ๋งค๋ญ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ ํ ํฌ๊ฒ ๋ง๋ค๊ธฐ ์ํด์ ๊ฐ Thread ๋ง๋ค์ ๋งค๋ญ์ ์์น๋ฅผ ๊ฒฐ์ ํ๊ณ ์ถ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ Figure ๊ทธ๋ฆผ์ 6๊ฐ์ Thread์ ๋ํ ๋งค๋ญ์ ์์น๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์๋ค. ๋งค๋ญ์ ์์น๋ ํฌ์ธํธ๋ก ๋ํ๋ด์ด ์ง๋ค. ๋ชจ๋ Thread๋ x-์ค์ฌ์ ์ ํํํ๋ค. ํ์ง๋ง ๊ทธ๋ค์ ์๋ก ์๋ก ๊ตฌ๋ถ๋์ด์ง๋๋ก ๋ถ๋ฆฌ๋์ด ๊ทธ๋ ค์ ธ ์๋ค. Figure l.1 ๊ทธ๋ฆผ์ ๋ณด๋ฉด, ๊ฐ์ฅ ๊ฐ๊น๊ฒ ์ธ์ ํ ๋ ๋งค๋ญ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ 20์ด๋ค. ํ์ง๋ง ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ $T_{2}$์ ๋งค๋ญ์ FigureI.2์ ๊ทธ๋ฆผ์ฒ๋ผ ์์น๋ฅผ ๋ฌ๋ฆฌํ๋ค๋ฉด, ๊ฐ์ฅ ์ธ์ ํ ๋ ๋งค๋ญ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ 25๊ฐ ๋ ๊ฒ์ด๊ณ , ์ด๊ฒ์ด ๋ฌธ์ ์์ ์๊ตฌํ๋ ๋ฐ์ด๋ค.
n ๊ฐ์ thread์ ๋ํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง ๋, ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ๋งค๋ญ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ ์ต๋๊ฐ ๋๋๋ก ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ฌ๋ผ
์ ๋ ฅ
๋น์ ์ ํ๋ก๊ทธ๋จ์ ํ์ค์ ์ธ ์ ๋ ฅ์ผ๋ก ์ฝ์ด๊ฐ๋ค. ์ ๋ ฅ์ ํ๋์ Integer n(Thread์ ๊ฐ์)์ ํฌํจํ๋ ํ๋์ ์ค๋ก ์์ํ๋ค. (2 <= n <= 100,0000) ๋ค์์ n๊ฐ์ ์ค๋ก ์ด์ด์ง๋ฉฐ, i ๋ฒ์งธ ์ค์ ๋๊ฐ์ Integer $x_i$์ $l_i$๊ฐ ์ฃผ์ด์ง๋ค. $x_i$์ $l_i$๋ ๊ฐ๊ฐ i ๋ฒ์งธ Thread์ ์์ ์ง์ ๊ณผ ๊ธธ์ด๋ฅผ ๋ํ๋ธ๋ค. ๋น์ ์ ํ๋์ Thread๊ฐ ๋ค๋ฅธ Thread์ ์ํด ์์ ํ ํฌํจ๋์ด์ง ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค. (๋ฌด์จ ๋ป์ด๋๋ฉด, $x_j$ <= $x_i$ ์ด๋ฉด์ $x_i$ + $l_i$<= $x_j + l_j$ ์ธ $T_i$์ $T_j$๋ ์กด์ฌํ์ง ์๋๋ค. )
์ถ๋ ฅ
๋น์ ์ ํ๋ก๊ทธ๋จ์ ํ์ค์ ์ธ ์ถ๋ ฅ์ผ๋ก ์ ์ด๊ฐ๋ค. ์ ํํ ํ๋์ ์ค๋ง ์ถ๋ ฅํด๋ผ. ํด๋น ์ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ๋งค๋ญ ์ฌ์ด์ ์ต๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ปํ๋ Integer ๊ฐ์ ํฌํจํด์ผ ํ๋ค.
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: PARAMETRIC SEARCH
, GREEDY ALGORITHM
- (1) ์ด๋ถ ํ์์
start
,end
,mid
๊ฐ ์์ ๋mid
๊ฐ์ ํ์ฉํด ๋งค๋ญ ์ฌ์ด์ ์์์ ๊ฑฐ๋ฆฌdistance
๋ฅผ ๋ง๋ค์ด ๋ธ๋ค. - (2) ํด๋น
distance
๊ฐ ๋งค๋ญ ์ฌ์ด์ ์ต์ ๊ฑฐ๋ฆฌ๋ผ๊ณ ๊ฐ์ ํ ๋, ๋ชจ๋ ๋งค๋ญ ์ฌ์ด ๊ฑฐ๋ฆฌ๊ฐdistance
์ด์์ด ๋ ์ ์๋์ง ์ฒดํฌํ๋ค. - (3 - 1) ๋๋ค๋ฉด
distance
๋ฅผ ์ข ๋ ๊ธธ๊ฒ ํด๋ ๋๋ค๋ ๋ป์ด๋ค. ๋ฐ๋ผ์Start
=mid
+ 1 ๋ก ๋ง๋ค๊ณ , (1)๋ฒ์ ๋ฐ๋ณตํ๋ค. - (3 - 2) ์๋๋ค๋ฉด
distance
๋ฅผ ์ข ๋ ์งง๊ฒ ์กฐ์ ํด์ผ ํ๋ค. ๋ฐ๋ผ์end
=mid
- 1 ๋ก ๋ง๋ค๊ณ (1) ๋ฒ์ ๋ฐ๋ณตํ๋ค. - (4) ์ด ๊ณผ์ ์
start
์end
๋ผ๋ ํฌ์ธํฐ๊ฐ ์๋ก ์๊ฐ๋ฆด ๋๊น์ง ๋ฐ๋ณตํ๋ฉด, ์ข ๊ตญ์start
๋ ๋ต์ด ๋ ์ ์๋ distance์ ์ต๋๊ฐ๋ณด๋ค ํ ์นธ ์์ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. (upper bound)
(1) < ์ด๋ถ ํ์์ ์ด๋ป๊ฒ ์ธ ๊ฒ์ธ๊ฐ? > Parametric Search์ ๋ํ์ฌ
ํด๋น ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด, ์ด๋ถ ํ์์ ์จ์ผ ํ๋ค๋ ๊ฒ์ด ์ง๊ด์ ์ผ๋ก ๋๊ปด์ง๋ค. ํ์ง๋ง ์ด๋์ ์ด๋ป๊ฒ ์จ์ผ ํ ์ง ๊ฐ์ด ์ ์กํ ์ ์๋ค. ์๋ํ๋ฉด ๋ฌธ์ ๊ฐ '์ต์๊ฐ์ ์ต๋๊ฐ์ ๊ตฌํ์ฌ๋ผ.'๋ผ์ ์ด๋ถํ์์ผ๋ก ์ฐพ์์ผ ํ ๊ฒ์ด ๋ ๊ฐ ์ฒ๋ผ ๋๊ปด์ง๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋๋ ์ด๋ถํ์์ ์ ๊ทผ๋ฒ ์ค ํ๋์ธ Parametric Search
๋ฅผ ํ์ฉํด๋ณผ๋ง ํ๋ค.
Parametric Search๋?
ํ๋์ ์ต์ ํ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ์ ๋ฌธ์
๋ก ๋ฐ๊พธ์ด์ ๋ฌธ์ ๋ฅผ ํ์ด๊ฐ๋ ์ ๊ทผ๋ฒ์ด๋ค.
์ต์ ํ ๋ฌธ์ ์ ๊ฒฐ์ ๋ฌธ์ ์ ๋ํ ๊ฐ๋
์ต์ ํ ๋ฌธ์ ๋
์ต์๊ฐ, ์ต๋๊ฐ์ ๊ตฌํ๋ ๊ฒ๊ณผ ๊ฐ์ด, ๋ต์ด ๋ ์ ์๋ ๋ฒ์ฃผ ์์์ ์ต์ ์ ํด๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ฅผ ๋งํ๋ค.
๋ฐ๋ฉด, ๊ฒฐ์ ๋ฌธ์ ๋ 'a+b๋ฅผ 35๋ก ๋ง๋๋ a,b ์์ ๊ตฌํ๋ผ', '๋ชจ๋ ๋งค๋ญ ๊ฐ์ ๊ฑฐ๋ฆฌ๊ฐ d ์ด์์ด๋ฉด Yes ์๋๋ฉด no๋ฅผ ์ถ๋ ฅํ๋ผ' ๋ฑ๋ฑ ์ ํํ ํด๊ฐ ์กด์ฌํ๊ฑฐ๋ Yes or No๋ก ๋ต์ด ๊ฐ๋ฅํ ๋ฌธ์ ๋ฅผ ๋งํ๋ค.
ํด๋น ๋ฌธ์ ์์๋ ๋งค๋ญ ์ฌ์ด ๊ฑฐ๋ฆฌ ์ต์๊ฐ๋ค ์ค์์ ์ต๋๊ฐ ๋ฐํ
์ ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋ ๋งค๋ญ ์ฌ์ด ๊ฑฐ๋ฆฌ๋ฅผ d ์ด์์ด ๋๊ฒ ํ๊ณ ์ถ์๋ฐ, ์ฑ๋ฆฝํ๋๊ฐ?
๋ผ๋ Yes or No ๋ฌธ์ ๋ก ๋ฐ๊พธ๋ฉด ๋๋ค.
์์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฑฐ๋ฆฌ๊ฐ d์ผ ๋, ๋ชจ๋ ๋งค๋ญ ์ฌ์ด์์ ๊ทธ ๊ฑฐ๋ฆฌ ์ด์์ด ๊ฐ๋ฅํ์ง ์๋๋์ง๋ฅผ boolean์ผ๋ก ๋ฐํํ๋ F(d)
๋ฅผ ์ฐ๋ฆฌ๊ฐ ๊ตฌํด๋จ๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ f(0) ~ f(2์ต)์ ์ผ๋ จ์ ๋ฐฐ์ด๋ก ๊ตฌํด์, ์ฌ๊ธฐ์ ์ด๋ถํ์์ ํ๋ฉด ๋๋ค.
์ด๋ถ ํ์์ด ๊ฐ๋ฅํ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ์ ๋ฌธ์ ์ ๋ฐํ ๊ฐ์ด ๋จ์กฐ์ ์ธ ์ฑ์ง
์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ด๋ค.f(x) = O
๋ผ๋ฉด, f(0) ๋ถํฐ f(X-1) ๊น์ง๋ O์ด๋ค. ์๋ํ๋ฉด, ๊ฑฐ๋ฆฌ 3์ ์ต์ ๊ฑฐ๋ฆฌ๋ก ๋ชจ๋ ๋งค๋ญ ์ฌ์ด ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด ๊ฑฐ๋ฆฌ๊ฐ 0์ธ ๊ฒฝ์ฐ, 1์ธ ๊ฒฝ์ฐ, 2์ธ ๊ฒฝ์ฐ์ ๋ํด์ ๋ฌด์กฐ๊ฑด ์ฑ๋ฆฝํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋๋ก f(x) = X
๋ผ๋ฉด, f(x+1) ~ f(2์ต) ๊น์ง๋ x์ด๋ค. ์๋ํ๋ฉด ๋ชจ๋ ๋งค๋ญ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ์ต์ 4 ์ด์์ผ๋ก ๋๋๋ฐ ์คํจ ํ๋ค๋ฉด, 5๋ก๋ ์๋๊ณ ๋ ๋์๊ฐ 2์ต์ผ๋ก๋ ์๋๋ค๋ ๊ฒ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋จ์กฐ์ ์ธ ์ฑ์ง๋๋ฌธ์ ์ฐ๋ฆฌ๋ ๊ฐ์ ์์ธกํ ์ ์๊ฒ ๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ์กฐ๊ฑด์ ์ฑ๋ฆฝํ๋ ๊ฐ ์ค ์ ์ผ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค. ๊ทธ f(d)
์ d๊ฐ ๋ฐ๋ก ๋ต์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
(PS) ๋ชจ๋ ์ต์ ํ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ์ ๋ฌธ์ ๋ก ๋ณํํ ์ ์๋ ๊ฒ์ ์๋๋ค. Parametric Search๋ฅผ ์ฐ๊ธฐ ์ํด์๋ ์์์ ์ดํด ๋ณด์๋ฏ์ด
2 ๊ฐ์ง
์กฐ๊ฑด์ด ํ์ํ๋ค. ๋ ์์ธํ ์๊ณ ์ถ์ ๋ถ๋ค์ ์ํด Parametric Search์ ๋ํ ๋งํฌ๋ฅผ ๋จ๊ฒจ๋๋๋ก ํ๊ฒ ๋ค.
(2) f(d)
๋ ์ด๋ป๊ฒ ๊ตฌํ๋์?
f(d)๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ Greedy Algorithm
์ ์ฌ์ฉํด์ผ ํ๋ค.
๋งค๋ญ์ ์ต๋ํ ํ Thread์ ์ผ์ชฝ์ ๋๋ ๊ฒ์ด ์ข๋ค. ์๋ํ๋ฉด ๊ทธ๋ ๊ฒ ๋์๋ก, ๋ค์ Thread์ ๋งค๋ญ์ ๋ ๋, ๊ฐ์ฉ ๋ฒ์๊ฐ ๋์ด์ง๊ธฐ์ f(d)๋ฅผ ๋ง์กฑ์ํฌ ํ๋ฅ ์ด ๋์์ง๊ธฐ ๋๋ฌธ์ด๋ค.
k1,k2,k3๊ฐ ๊ฐ๊ฐ 0, 25, 50์ ์์นํ๋ฉด์ d = 25 ์ด์์ ๋ง์กฑํ๋ค. ๋ฌผ๋ก k2์ k3๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฎ๊ฒจ์๋ ๊ฐ๋ฅํ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ด k2์ Thread๊ฐ 25 ~50 ์ฌ์ด์์๋ง ์ ์ง๋ ๊ฒฝ์ฐ ์๋ ๊ฒ์ด๋ค.
์์ ๊ฐ์ด ์ต๋ํ ์ผ์ชฝ์ ๋์์ ๋, f(d)
๋ฅผ ์ฑ๋ฆฝํ๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง๋ค๋ฉด, ๊ทธ๊ฒ์ด ์ต์ ์ ์ ํ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ต์ ์ ์ ํ์ด ๋์ ๋ ๊ฒ์ด f(d)
์ true ๊ฐ ๋ฐํ ํ๋ฅ ์ ๋์์ผ๋ก, ์ด๊ฒ์ Greedy ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํด๋ ๋๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
(3) ๊ทธ๋ฌ๋ฉด f(d)
๋ฅผ 0๋ถํฐ 2์ต๊น์ง ๊ตฌํด์ผ ํ๋์?
์๊น f(0) ~ f(2์ต)๊น์ง ์ค ์ด๋ถ ํ์์ ํด์ผํ๋ค๊ณ ํด์ ์ด๋ฌํ ๊ถ๊ธ์ฆ์ด ๋ ์ค๋ฅผ ์ ์๊ฒ ๋ค. ํ์ง๋ง ์ด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ ๋ฟ๋๋ฌ, 2์ต ๊ฐ์ boolean ๊ฐ์ ์ ์ฅํด์ผ ํ๋ฏ๋ก 2GB๋ฅผ ํ์๋ก ํ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ ๋ํ ๋๋ค. (1byte * 2์ต)
์ฌ์ค ์ ๋ถ ๊ตฌํ ํ์๊ฐ ์๋ค. ์๋ํ๋ฉด, ๋ฐ๋ก Parametric Search์ ๋จ์กฐ์ ์ธ ์ฑ์ง ๋๋ฌธ์ด๋ค. ์๊น๋ ๋ดค๋ฏ์ด f(x)์ ๋ต์ด false๋ฉด ๊ทธ๊ฒ ์ด์์ ๊ฐ๋ค์ ๋ชจ๋ false ์๋ค. ๋ฐ๋ผ์ ๊ทธ ๋ถ๋ถ์ ๊ตฌํ ํ์ ์์ด ์์ญ์ ์ค์ฌ๋๊ฐ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
3. ์ฝ๋ ์๊ฐ ๐
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
static ArrayList<Th> list = new ArrayList<>();
public static void main(String[] args) throws IOException {
// ์
๋ ฅ ๋ฐ๊ธฐ
int t_cnt;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
t_cnt = Integer.parseInt(br.readLine());
for (int i = 0; i < t_cnt; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
list.add(new Th(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
}
Collections.sort(list);
System.out.println(binary_search());
}
public static int binary_search() {
int start = 0;
int end = 2000000000;
while (start <= end) {
int mid = start + (end - start)/2;
if(isOk(mid)) start = mid + 1;
else end = mid - 1;
}
return start - 1;
}
public static boolean isOk(int distance) {
ArrayList<Integer> knots = new ArrayList<>();
knots.add(list.get(0).s);
for (int i = 1; i < list.size(); i++) {
Th now_Th = list.get(i);
int now_knot = now_Th.s;
int prev_knot = knots.get(i-1);
if(now_knot - prev_knot < distance){
now_knot = prev_knot + distance;
if(now_knot > now_Th.e){
// System.out.println(now_Th + " " + prev_knot + " " + now_knot);
return false;
}
}
knots.add(now_knot);
}
return true;
}
}
class Th implements Comparable<Th> {
int s;
int e;
public Th (int s, int l) {
this.s = s;
this.e = s + l;
}
@Override
public int compareTo(Th o) {
return this.s - o.s;
}
@Override
public String toString() {
return "s=" + s + " e=" + e;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
axis
: ์ค์ฌ์denote
: ๋ํ๋ด๋ค.knot
: ๋งค๋ญassume
: ์ถ์ ํ๋ค. ๊ฐ์ ํ๋ค.totally
: ์์ ํcontain
: ํฌํจํ๋ค.respectively
: ๊ฐ๊ธฐ, ๊ฐ๊ฐ