1 λΆ„ μ†Œμš”

λ°±μ€€ μ‚¬μ΄νŠΈ 링크

문제

행볡 μœ μΉ˜μ› 원μž₯인 νƒœμ–‘μ΄λŠ” μ–΄λŠ λ‚  Nλͺ…μ˜ 원생듀을 ν‚€ μˆœμ„œλŒ€λ‘œ 일렬둜 쀄 μ„Έμš°κ³ , 총 K개의 쑰둜 λ‚˜λˆ„λ €κ³  ν•œλ‹€. 각 μ‘°μ—λŠ” 원생이 적어도 ν•œ λͺ… μžˆμ–΄μ•Ό ν•˜λ©°, 같은 쑰에 μ†ν•œ 원생듀은 μ„œλ‘œ 인접해 μžˆμ–΄μ•Ό ν•œλ‹€. μ‘°λ³„λ‘œ μΈμ›μˆ˜κ°€ 같을 ν•„μš”λŠ” μ—†λ‹€.

μ΄λ ‡κ²Œ λ‚˜λ‰˜μ–΄μ§„ 쑰듀은 각자 단체 ν‹°μ…”μΈ λ₯Ό λ§žμΆ”λ €κ³  ν•œλ‹€. μ‘°λ§ˆλ‹€ ν‹°μ…”μΈ λ₯Ό λ§žμΆ”λŠ” λΉ„μš©μ€ μ‘°μ—μ„œ κ°€μž₯ ν‚€κ°€ 큰 원생과 κ°€μž₯ ν‚€κ°€ μž‘μ€ μ›μƒμ˜ ν‚€ 차이만큼 λ“ λ‹€. μ΅œλŒ€ν•œ λΉ„μš©μ„ 아끼고 μ‹Άμ–΄ ν•˜λŠ” νƒœμ–‘μ΄λŠ” K개의 쑰에 λŒ€ν•΄ ν‹°μ…”μΈ  λ§Œλ“œλŠ” λΉ„μš©μ˜ 합을 μ΅œμ†Œλ‘œ ν•˜κ³  μ‹Άμ–΄ν•œλ‹€. νƒœμ–‘μ΄λ₯Ό 도와 μ΅œμ†Œμ˜ λΉ„μš©μ„ κ΅¬ν•˜μž.

μž…λ ₯

μž…λ ₯의 첫 μ€„μ—λŠ” μœ μΉ˜μ›μ— μžˆλŠ” μ›μƒμ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μžμ—°μˆ˜ N(1 ≀ N ≀ 300,000)κ³Ό λ‚˜λˆ„λ €κ³  ν•˜λŠ” 쑰의 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μžμ—°μˆ˜ K(1 ≀ K ≀ N)κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 주어진닀. λ‹€μŒ μ€„μ—λŠ” μ›μƒλ“€μ˜ ν‚€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” N개의 μžμ—°μˆ˜κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 쀄 μ„œ μžˆλŠ” μˆœμ„œλŒ€λ‘œ 주어진닀. νƒœμ–‘μ΄λŠ” 원생듀을 ν‚€ μˆœμ„œλŒ€λ‘œ 쀄 μ„Έμ› μœΌλ―€λ‘œ, μ™Όμͺ½μ— μžˆλŠ” 원생이 였λ₯Έμͺ½μ— μžˆλŠ” 원생보닀 크지 μ•Šλ‹€. μ›μƒμ˜ ν‚€λŠ” 109λ₯Ό λ„˜μ§€ μ•ŠλŠ” μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

ν‹°μ…”μΈ  λ§Œλ“œλŠ” λΉ„μš©μ΄ μ΅œμ†Œκ°€ λ˜λ„λ‘ K개의 쑰둜 λ‚˜λˆ„μ—ˆμ„ λ•Œ, ν‹°μ…”μΈ  λ§Œλ“œλŠ” λΉ„μš©μ„ 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1

5 3
1 3 5 6 10

예제 좜λ ₯ 1

3

힌트

  • 1μ‘°: 1, 3
  • 2μ‘°: 5, 6
  • 3μ‘°: 10

풀이

  1. μž…λ ₯을 λ°›κ³ , 각 ν•™μƒμ˜ ν‚€λ₯Ό λ¦¬μŠ€νŠΈλ‚˜ 배열에 μ €μž₯
  2. 학생듀을 ν‚€ μˆœμ„œλŒ€λ‘œ μ •λ ¬
  3. μΈμ ‘ν•œ 학생듀 κ°„μ˜ ν‚€ 차이λ₯Ό κ³„μ‚°ν•˜μ—¬ 합을 κ΅¬ν•œλ‹€.
  4. μΈμ ‘ν•œ 학생듀 κ°„μ˜ ν‚€ μ°¨μ΄λŠ” ν˜„μž¬ ν•™μƒμ˜ ν‚€μ—μ„œ λ‹€μŒ ν•™μƒμ˜ ν‚€λ₯Ό λΊ€ κ°’
  5. μΈμ ‘ν•œ 학생듀 κ°„μ˜ ν‚€ 차이의 합을 좜λ ₯

μ½”λ“œ

ver(1) - Greedy μ‚¬μš©

μ‹œκ°„ λ³΅μž‘λ„λŠ” O(nlogn)

import sys
input = sys.stdin.readline

# 원생 μˆ˜μ™€ μ œκ±°ν•  원생 수λ₯Ό μž…λ ₯λ°›μŠ΅λ‹ˆλ‹€.
n, k = map(int, input().split())

# μ›μƒλ“€μ˜ ν‚€ 정보λ₯Ό 리슀트둜 μž…λ ₯λ°›μŠ΅λ‹ˆλ‹€.
kids = list(map(int, input().split()))

# μΈμ ‘ν•œ μ›μƒκ³Όμ˜ ν‚€ 차이λ₯Ό κ³„μ‚°ν•˜μ—¬ λ¦¬μŠ€νŠΈμ— μ €μž₯ν•©λ‹ˆλ‹€.
diff = [kids[i+1] - kids[i] for i in range(n-1)]

# ν‚€ 차이λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€.
diff.sort()

# μ œκ±°ν•  원생 수(n-k)만큼 ν‚€ 차이의 합을 κ³„μ‚°ν•˜μ—¬ 좜λ ₯ν•©λ‹ˆλ‹€.
print(sum(diff[0:n-k]))

λŒ“κΈ€λ‚¨κΈ°κΈ°