Hướng dẫn giải của duong3982oj Contest 04 - Miku ham ăn


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Tác giả: noodles0428

Subtask 1: ~k = 1~

Với mỗi ngày, ta sẽ xét từ món có kcal nhỏ nhất rồi trừ đi một đơn vị. Nếu như số lượng món có kcal nhỏ nhất đã về 0, các ngày tiếp theo ta sẽ xét đến món có kcal nhỏ nhì và tiếp tục như thế.

Subtask 2: ~k = 2~

Tương tự như subtask 1, ta sẽ xét từ món có kcal nhỏ nhất và nhỏ nhì trừ đi một đơn vị. Nếu số lượng món kcal nhỏ nhất đã về 0, ta sẽ xét đến kcal nhỏ nhì và ba, còn nếu số lượng món kcal nhỏ nhì đã về 0, ta sẽ xét đến kcal nhỏ nhất và ba và tiếp tục như thế.

Subtask 3: ~n = 1~

Rõ ràng, đáp án ở bài toán này chính là ~max(b[1] - 7, 0)~ khi chỉ có duy nhất một món ăn, và Miku chỉ có thể ăn món ăn đó.

Subtask 4: Không có giới hạn gì thêm.

Ta sẽ phát triển từ subtask 1 và 2 để ra được subtask này.

Ta sẽ duyệt các món ăn có lượng kcal từ nhỏ đến lớn rồi kiểm tra xem liệu món ăn này đã hết hay chưa. Nếu vẫn còn, ta sẽ trừ số lượng món ăn đi 1 đơn vị, và tăng biến đếm kiểm soát số lượng món ăn đã ăn vào ngày đang xét lên 1. Lưu ý, nếu số lượng món đã ăn đạt ~k~, ta sẽ không xét tiếp tới các ngày tiếp theo nữa.

Code mẫu:

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

#define int long long
const int N = 1e6 + 9;

int n, k;

struct value {
    int a, b, id;
} arr[N];

bool cmp(value a, value b) {
    return a.a < b.a;
}

bool cmp2(value a, value b) {
    return a.id < b.id;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i].a;
    }
    for (int i = 1; i <= n; i++) {
        cin >> arr[i].b;
        arr[i].id = i;
    }
    sort(arr + 1, arr + 1 + n, cmp);
    for (int _ = 0; _ < 7; _++) {
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
            if (cnt == k) break;
            if (arr[i].b != 0) {
                arr[i].b--;
                ++cnt;
            }
        }
    }
    sort(arr + 1, arr + 1 + n, cmp2);
    for (int i = 1; i <= n; i++) {
        cout << arr[i].b << " ";
    }
    return 0;
}

// <33

Bình luận

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


Không có bình luận tại thời điểm này.