https://www.acmicpc.net/problem/13164
[난이도] Gold5
[유형] Greedy
[풀이]
K개의 조로 나눈다는 것을 결국 K-1개의 경계를 골라야 한다는 의미입니다.
키가 작은 순서로 0번부터 N-1번 원생이 서있다면,
경계를 나누지 않을 경우의 비용은 a[N-1]-a[0] 입니다. (a[i] : i번 원생의 키)
만약 i와 i-1 사이에 경계를 추가한다면 a[i]-a[i-1] 만큼은 비용에서 제외됩니다.
결국 K개의 조로 나눴을 때 가장 비용을 적게 하려면
K-1의 경계 중 가장 비용이 큰 경계를 고르면 됩니다.
a[i]-a[i-1] (i:1~N-1) 의 값을 배열에 저장한 뒤, 정렬하여 K-1개의 큰 비용을 구해서
전체 비용에서 빼주면 쉽게 구할 수 있습니다.
#include <cstdio>
#include <algorithm>
using namespace std;
int N,K,a[300000],ans;
int main(){
scanf("%d%d",&N,&K);
for(int i=0;i<N;i++) scanf("%d",&a[i]);
sort(a,a+N);
ans = a[N-1]-a[0];
for(int i=N-1;i>=1;i--) a[i]=a[i]-a[i-1];
a[0]=0;
sort(a,a+N);
for(int i=N-1;K>1;K--,i--) ans-=a[i];
printf("%d",ans);
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold5/13164.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold5] 1451 : 직사각형으로 나누기 (C++) (0) | 2022.02.12 |
---|---|
[BOJ/백준][Gold5] 14567 : 선수과목 (C++) (0) | 2022.02.12 |
[BOJ/백준][Gold5] 15971 : 두 로봇 (C++) (0) | 2022.01.23 |
[BOJ/백준][Gold5] 7490 : 0 만들기 (C++) (0) | 2022.01.23 |
[BOJ/백준][Gold5] 2671 : 잠수함식별 (C++) (0) | 2022.01.23 |