βοΈ λ¬Έμ
https://www.acmicpc.net/problem/11561
μΉνμ΄λ κ°μ 건λλ € νλ€.
μΉνμ΄λ μμμ λͺ»νκΈ° λλ¬Έμ, κ°μ λμΈ μ§κ²λ€λ¦¬λ₯Ό λ°κ³ 건λκ° κ²μ΄λ€.
μΉνμ΄λ μμμ λͺ»νμ§λ§ μ μ리λ°κΈ°λ μ λ§ μνλ€. μνλ μ΄λ κ³³μΌλ‘λ μ§ μ νν΄μ λ°λ‘ κ° μκ° μλ€.
μΉνμ΄λ μ΄μ κ°μ νμͺ½ λ³ μμ μ μλ€.
κ°μ 1λ²λΆν° μμν΄ 2λ², 3λ², ... , Nλ² μ§κ²λ€λ¦¬κ° μ°¨λ‘λλ‘ λμ¬ μλ€.
κ°μ νμ΄ λμ νμ μ§κ²λ€λ¦¬μ μλ μμ²λκ² λ§λ€.
μ΄ μ§κ²λ€λ¦¬λ₯Ό λͺ¨λ λ°κ³ μΆμ§λ μμλ μΉνμ΄λ μ μ리λ°κΈ° μ€λ ₯μ λ°νν΄ μ μ ν κ°μμ μ§κ²λ€λ¦¬λ§μ λ°κ³ κ°κΈ°λ‘ νλ€.
λ¬Όλ‘ κ° κ±΄λνΈμΌλ‘ λ°λ‘ μ ννλ κ²λ κ°λ₯νμ§λ§, λ μ¬λ―Έμκ² κ°μ 건λκΈ° μν΄ μΉνμ΄λ λ€μκ³Ό κ°μ κ·μΉμ μ νλ€.
- 첫 μ§κ²λ€λ¦¬λ μ νν΄μ μ무 κ²μ΄λ λ°μ μ μλ€. μ΄ μ νκ° μ²« μ νμ΄λ€.
- λ λ²μ§Έ μ νλΆν°λ μ΄μ μ μ νν κ±°λ¦¬λ³΄λ€ 1 μ΄μ λ κΈ΄ 거리λ₯Ό λ°μ΄μΌλ§ νλ€.
- Nλ² μ§κ²λ€λ¦¬λ λ°λμ λ°μμΌ νλ€.
- Nλ² μ§κ²λ€λ¦¬λ₯Ό λ°μ ν κ° κ±΄λλ‘ μ΄λν λ μ νλ₯Ό νμ§ μμΌλ―λ‘ μμ κ·μΉμ΄ μ μ©λμ§ μλλ€.
μΉνμ΄κ° μμ κ·μΉμ μ§ν€λ©° κ°μ 건λ λ, λ°μ μ μλ μ§κ²λ€λ¦¬μ μ΅λ μλ λͺ κ°μΌκΉ?
π€ μ μΆλ ₯ μμ
π§ λμ΄λ/μμ μκ°
β λμ΄λ: solved.ac κΈ°μ€ S3
β μμ μκ°: 1μκ° 50λΆ
β κΆμ₯ μκ°: 45λΆ
π‘ νμ΄
1) λ¬Έμ μ ν νμ
μ΄μ κ²°μ¬νλλ‘ λ¬Έμ λ₯Ό λ³΄κ³ λμ 10λΆ λμ λ¬Έμ μ νμ λν΄ κ³ λ―Όνλ€.
μ²μμλ μ μΆλ ₯ νμμ΄ λκ° DPμ€λ½λ€κ³ μκ°νλλ° μ무리 DPλ‘ νμ΄λ 10^16 λ²μλ₯Ό μ²λ¦¬ν μκ° μλ? μΆμλ€. νμ§λ§ μμ½κ²λ μ¬κΈ°μ μ΄λΆ νμμ μ¨μΌκ² λ€λ μκ°μΌλ‘ μ΄μ΄μ§μ§λ λͺ»νκ³ , κ·ΈλΌ λ μ¨μΌ νμ§? νλ μ€μ 10λΆμ΄ μ΄κ³Όν΄μ μκ³ λ¦¬μ¦ λΆλ₯λ₯Ό ν΅ν΄ μ μ΄λΆ νμμ΄κ΅¬λ νλ κ±Έ μκ² λλ€.
2) μμ΄λμ΄ νλ¦
β βν΅μ¬ (1)β
'μ΄λ»κ² ν΄μΌ μ§κ²λ€λ¦¬λ₯Ό μ΅λλ‘ λ°μ μ μμκΉ?'λΌλ μλ¬Έμ λν΄ λ΄κ° λ΄λ¦° κ²°λ‘ μ 'μ‘°κΈμ©λ§ μ ννλ κ²'μ΄λ€.
λ¬Έμ μ μ ν ννμ νμ©ν΄ λ€μ μ μ΄λ³΄μλ©΄ 'μ΄μ μ μ νν κ±°λ¦¬λ³΄λ€ λ± 1λ§νΌλ§ λ κΈΈκ² μ ν'ν΄μΌλ§ λ°λ μ§κ²λ€λ¦¬ μλ₯Ό μ΅λλ‘ λ§λ€ μ μλ€.
β‘ βν΅μ¬ (2)β
μ΄λΆ νμ λ¬Έμ λ start, end λ²μλ₯Ό μ‘°μ νκΈ° μν μ‘°κ±΄μ΄ νμνλ° 'μ ν 거리 λμ ν©' κ°λ κ³Ό ν΅μ¬ (1)μ λ΄μ©μ κ°μ§κ³ μ΄ λ¬Έμ μμ νμν 쑰건μ λμΆν μ μλ€.
μ ν 거리 λμ ν© = 첫 λ²μ§Έ μ ν 거리+λ λ²μ§Έ μ ν 거리+...+Kλ²μ§Έ μ ν 거리 |
κ²°κ΅ Nλ²μ§Έ μ§κ²λ€λ¦¬λ 무쑰건 λ°μΌλ©΄μ μ΅λ μ§κ²λ€λ¦¬λ₯Ό λ°μ μ μλ μ ν 거리 λμ ν©μ 1λΆν° KκΉμ§μ μμ°μ ν©μ ꡬνλ κ²κ³Ό λμΌνλ€. 1+2+3+...+Kλ $\frac{{(K*(K+1))}{2}$λ‘ νν κ°λ₯νλ€.
β’ 1λΆν° KκΉμ§μ ν©μ ꡬνλ μμ μ΄μ©ν΄ start, end λ²μλ₯Ό μ‘°μ ν μ μλ€.
$\frac{{(K*(K+1))}{2}$κ° Nλ³΄λ€ ν΄ κ²½μ°: μ ν 거리 λμ ν©μ΄ μ§κ²λ€λ¦¬ κ°μλ³΄λ€ ν¬λ€λ κ²μ μ΄λ»κ² ν΄λ Nλ²μ§Έ μ§κ²λ€λ¦¬λ₯Ό λ°μ μ μλ€λ λ»μ΄ λλ€. μ΄λ° κ²½μ°μλ end = mid-1λ‘ κ°±μ ν΄ λ μμ λ²μλ₯Ό νμν μ μλλ‘ νλ€.
$\frac{{(K*(K+1))}{2}$κ° Nλ³΄λ€ μμ κ²½μ°: μ΄ λλ λ§μ§λ§ μ§κ²λ€λ¦¬μμ κΈ΄ μ νλ‘ Nλ²μ§Έ μ§κ²λ€λ¦¬λ₯Ό 무쑰건 λ°μ μ μκ² λλ€. λ¬Έμ μμ μνλ 건 μ΅λκ°μ΄κΈ° λλ¬Έμ Nλ³΄λ€ κ°μ΄ μμ λ²μμμ κ°μ₯ ν° Kλ₯Ό μ°ΎκΈ° μν΄ start = mid+1λ‘ κ°±μ νλ€.
3) ꡬν
import sys
input = sys.stdin.readline
T = int(input())
for _ in range(T):
N = int(input())
answer = 0
# 1+2+3+...+(K-2)+(K-1)+K=K(K+1)//2
start, end = 1, N
max_stone = float("-inf")
while start <= end:
mid = (start+end)//2
jump_distance = (mid*(mid+1))//2
# μ ν 거리 λμ ν©μ΄ Nλ³΄λ€ ν¬λ©΄ Nλ²μ§Έ μ§κ²λ€λ¦¬λ₯Ό λͺ» λ°μ
if jump_distance > N:
end = mid-1
else:
max_stone = max(max_stone, mid)
start = mid+1
print(max_stone)
4) μ΄λ €μ λ μ /λ°°μ΄ μ
π¨ μ΄λ €μ λ μ
- μ ν 거리 λμ ν©μ΄ Nλ³΄λ€ ν΄ λ, μμ λμ μλ―Έλ₯Ό νμ νλ λ°μ μκ°μ΄ μ‘°κΈ κ±Έλ Έλ€.
β λ°°μ΄ μ
- μ μΆλ ₯ λ²μκ° λ§λ μ λκ² ν΄ λλ $O(log_{N})$μ μκ° λ³΅μ‘λλ₯Ό κ°λ μ΄λΆ νμ κΈ°λ²μ μ΄λ»κ² μ μ©ν μ μμμ§ κ³ λ―Όν΄λ³΄μ!
'Problem Solving > [νν΄99] TIL' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
99ν΄λ½ μ½ν μ€ν°λ 6μΌμ°¨ TIL / μ΄λΆ νμ (0) | 2024.11.03 |
---|---|
99ν΄λ½ μ½ν μ€ν°λ 5μΌμ°¨ TIL / BFS(λλΉ μ°μ νμ) (0) | 2024.11.02 |
99ν΄λ½ μ½ν μ€ν°λ 4μΌμ°¨ TIL / DFS(κΉμ΄ μ°μ νμ) (0) | 2024.10.31 |
99ν΄λ½ μ½ν μ€ν°λ 3μΌμ°¨ TIL / μ΄λΆ νμ (0) | 2024.10.30 |
99ν΄λ½ μ½ν μ€ν°λ 1μΌμ°¨ TIL / μ΄λΆ νμ (0) | 2024.10.28 |