πŸ•οΈ ICPC Sinchon/Greedy

[BOJ][C++] λ°±μ€€ 13164번: 행볡 μœ μΉ˜μ› (Gold V)

선달 2025. 3. 19. 03:12
λ°˜μ‘ν˜•

문제

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

μž…λ ₯

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

좜λ ₯

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

 

풀이

이건 그리디닀.

λΉ„μš©μ˜ 합이 μ΅œμ†Œ = ν‚€ 차이의 합이 μ΅œμ†Œ

 

예제λ₯Ό 보자 -> ν‚€κ°€ 1,3,5,6,10 이닀

그럼 μΈμ ‘ν•˜λŠ” ν‚€μ˜ μ°¨μ΄λŠ” 2,2,1,4λ‹€.

λ§Œμ•½ 이 아이듀이 λ‹€ 같은 쑰라면? λΉ„μš©μ€ 2+2+1+4 =9κ°€ λœλ‹€. (10-1 κ³Ό κ°™μŒ)

μ‘° λ‘κ°œλ‘œ λ‚˜λˆˆλ‹€λ©΄? 1356 λ„€λͺ… μ‘° (λΉ„μš© 2+2+1=5) 와 10 ν•œλͺ… μ‘° (λΉ„μš© 0) μΌλ•Œ λΉ„μš©μ΄ μ΅œμ†Œλ‹€

 

μ—¬κΈ°μ„œ ν¬μΈνŠΈλŠ” ν‹°μ…”μΈ  μ œμž‘ λΉ„μš©μ€ μΈμ ‘ν•œ ν‚€μ˜ μ°¨μ΄λ“€μ˜ 합인데

μ‘°λ₯Ό λ‚˜λˆ„λ©΄ λ‚˜λˆ μ§„ λΆ€λΆ„μ˜ ν‚€ 차이(= λΉ„μš©)κ°€ 0μ΄λœλ‹€λŠ” 것

 

그림으둜 보면 이해가 μ’€ λ‚˜μ„μ§€λ„

각각 μ‘°λ₯Ό 0개, 1개, 2개, 3개둜 λ‚˜λˆ„λŠ” 경우

 

κ²°κ΅­ μ›λ¦¬λ§Œ μ•Œλ©΄ κ΅¬ν˜„μ€ μ‰¬μš΄ λ¬Έμ œμ˜€λ‹€

μΈμ ‘ν•œ ν‚€ 차이듀 쀑 κ°€μž₯ 큰 k개λ₯Ό μ œμ™Έν•œ 합이 μ΅œμ†Œ λΉ„μš©μ΄λ‹€

(μ œμ™Έλ˜λŠ” 차이가 쑰의 경계라고 μƒκ°ν•˜λ©΄ νŽΈν•¨)

 

μ½”λ“œ

// 풀이 : https://whkakrkr.tistory.com

#include <bits/stdc++.h>

using namespace std;


int solution(int n, int k, vector<int>&a) {
    int ans = 0;
    
    vector<int>diff(n-1);
    for(int i=0; i<n-1; i++) {
        diff[i] = a[i+1] - a[i];
    }
    
    sort(diff.begin(), diff.end(), greater<>());
    
    for(int i=k-1; i<n-1; i++) {
        ans += diff[i];
    }
    
    return ans;
}

int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	int n,k;
	cin >> n >> k;
	vector<int>a(n);
	for(int i=0; i<n; i++) {
	    cin >> a[i];
	}
	
	cout << solution(n, k, a);
	
    return 0;
}
λ°˜μ‘ν˜•