본문 바로가기
풀이

[백준] 2317 - 결혼식 (c++)

by 땅왕 2024. 11. 19.

https://www.acmicpc.net/problem/2317

 

문제 요약

N개의 수가 주어진다. K개의 수는 순서를 바꿀수 없고 나머진 바꿀 수 있을 때, 인접한 앞뒤 수의 차이를 모두 더한 값의 최솟값을 구해라.

 

풀이 (N)

  • 그리디

순서를 바꿀 수 없는 수들 사이에 바꿀 수 있는 수를 최소가 되게 잘 끼워 넣으면 된다. [l,r] 구간에 속하는 수들에 대해 비용은 r-l이기 때문에 최솟값과 최댓값만 신경쓰면 된다. 순서를 바꿀 수 있는 수들과 바꿀 수 없는 수들의 최솟값과 최댓값을 각각 hmn,hmx,lmn,lmx라고 하자. hmn<lmn일 때와 hmx>lmx일 때 수를 가운데 끼워 넣거나 양 끝에 넣는 경우 중 가장 차이가 적은 것을 고르면 된다. 

#include <bits/stdc++.h>
using namespace std;
#define ll long long

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n,k;cin>>n>>k;
    vector<int> a(k),b(n-k);
    int lmx=0,lmn=1e10;
    for(int& x:a)cin>>x,lmx=max(lmx,x),lmn=min(lmn,x);
    int hmx=0,hmn=1e10;
    for(int& x:b)cin>>x,hmx=max(hmx,x),hmn=min(hmn,x);
    ll ans=0;
    for(int i=1;i<k;i++) 
        ans+=abs(a[i]-a[i-1]);
    if(hmn<lmn)
        ans+=min({abs(hmn-lmn)*2,abs(a[0]-hmn),abs(a[k-1]-hmn)});
    if(hmx>lmx)
        ans+=min({abs(hmx-lmx)*2,abs(a[0]-hmx),abs(a[k-1]-hmx)});
    cout<<ans;
}

'풀이' 카테고리의 다른 글

[백준] 10159 - 저울 (c++)  (0) 2024.11.29
[백준] 3267 - TWO (c++)  (2) 2024.11.20
[백준] 2185 - 직사각형의 합집합 (c++)  (1) 2024.11.19
[백준] 1854 - K번째 최단경로 (c++)  (0) 2024.11.18
[백준] 3233 - BRODOVI (c++)  (1) 2024.10.31