본문 바로가기
풀이

[백준] 24502 - blobsad (c++)

by 땅왕 2025. 3. 27.

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

 

문제 요약

N개의 통을 나란히 있고 각 통에 있는 블롭 개수가 주어진다. 한 블롭을 인접한 칸으로 옮기는데 1초가 걸린다.

모든 통의 블롭 개수를 K의 배수로 만드는데 걸리는 최소 시간을 구해라.

 

풀이 (N)

  • 그리디

전체 블롭의 수가 K의 배수라면 i~j까지 구간의 블롭개수를 모두 K의 배수로 맞췄을 때 j+1~N의 블롭 수의 합이 K배수가 된다. 따라서 모든 i를 순회하며 {i,i+1} 쌍에서 어느 쪽으로 몇 마리 옮길지만 그리디하게 결정해줘도 된다. 

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define mid (st+en>>1)

int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n,k;cin>>n>>k;
    vector<ll> o(n);
    for(auto&x:o)cin>>x;
    
    ll ans=0;
    for(int i=0;i<n-1;i++) {
        if(o[i]%k*2<k)
            o[i+1]+=o[i]%k,ans+=o[i]%k;
        else
            o[i+1]+=o[i]%k,ans+=k-o[i]%k;
    }

    if(o[n-1]%k)
        cout<<"blobsad";
    else    
        cout<<ans;
}

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

[백준] 22355- 말뚝 (c++)  (0) 2025.04.16
[백준] 22354 - 돌 가져가기 (c++)  (0) 2025.04.09
[백준] 26105 - Folding Stick (c++)  (0) 2025.03.27
[백준] 4354 - 문자열 제곱 (c++)  (0) 2025.03.20
[백준] 11873 - 최대 직사각형 (c++)  (0) 2025.03.17