Free Contest Testing Round 2.2 - MINDIST

Xem dạng PDF

Gửi bài giải

Điểm: 0,75 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M

Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Trong trường hợp đề bài hiển thị không chính xác, bạn có thể tải đề bài tại đây: Đề bài

Lưu ý: các bạn không nhập, xuất dữ liệu bằng file kể cả khi đề bài có yêu cầu. Đọc, ghi dữ liệu được thực hiện ở stdin và stdout.


Bình luận

Hãy đọc nội quy trước khi bình luận.



  • -2
    username001  đã bình luận lúc 8, Tháng 10, 2025, 6:43

    Hướng dẫn giải

    include <bits/stdc++.h>

    using namespace std;

    using int64 = long long;

    int main() { ios::syncwithstdio(false); cin.tie(nullptr);

    int N;
    int64 K;
    if (!(cin >> N >> K)) return 0;
    vector<int64> b(N);
    for (int i = 0; i < N; ++i) {
        int64 a; cin >> a;
        int64 r = a % K;
        if (r < 0) r += K;
        b[i] = r;
    }
    
    sort(b.begin(), b.end());
    
    // initial sum for r = 0
    int64 curSum = 0;
    for (int i = 0; i < N; ++i) {
        curSum += (K - b[i]) % K;          // (K - b_i) if b_i != 0, else 0
    }
    
    int64 answer = curSum;
    int64 curR = 0;                       // current r
    
    // scan distinct residues
    for (size_t i = 0; i < b.size(); ) {
        int64 val = b[i];
        // count how many equal to val
        size_t j = i;
        while (j < b.size() && b[j] == val) ++j;
        int64 cnt = j - i;                // number of people with residue = val
    
        int64 delta = val - curR;         // distance we move r forward
        curSum += delta * N;              // linear increase
        curSum -= cnt * K;                // jumps down at this residue
        curR = val;
    
        answer = min(answer, curSum);
    
        i = j;
    }
    
    cout << answer << '\n';
    return 0;
    

    }