PS/백준 알고리즘[BOJ]
[백준 13164번] 행복 유치원 (C++)
BE_개발자
2023. 12. 21. 13:46
728x90
반응형
그리디 문제이다. 조를 나누는 문제이므로 K-1의 칸막이를 설치한다고 생각할 수 있다.
직관: 한 조의 차이가 가장 작아야 하므로 일단 가장 차이가 큰 곳에 칸막이를 우선적으로 설치하면 차이가 최대가 될 것 같다.
반례: 가정 결론 도출
코드
#include<iostream>
#include<algorithm>
#define F first
#define S second
using namespace std;
int N, K, h[300000], sum;
pair<int, int> dif[300000];
bool devide[300000];
int main(void){
cin.tie(0);
cout.tie(0);
ios_base::sync_with_stdio(0);
cin >> N >> K;
for(int i=0; i<N; i++) cin >> h[i];
for(int i=0; i<N-1; i++) dif[i] = {h[i+1] - h[i], i};
sort(dif, dif + N-1, greater<pair<int, int>>());
int j = K-1;
//for(int i=0; i<N-1; i++) cout << dif[i].first << " ";
for(int i=0; i<K-1; i++) devide[dif[i].S] = true;
int st = 0;
devide[N-1] = true;
for(int en=0; en<N; en++){
if(devide[en]) {
sum += h[en] - h[st];
st = en + 1;
}
}
cout << sum;
return 0;
}
728x90
반응형