AC

咲ら  •  2天前


#include <iostream>
#include <vector>
using namespace std;

typedef long long ll;
const int maxn = 50010;
int N, D;
ll H[maxn];
int assign[maxn]; 
bool check(ll x, bool record = false) {
    if (x == 0) {
        if (record) {
            for (int i = 0; i < N; i++) {
                assign[i] = 1;
            }
        }
        return true;
    }

    ll cur = 0; 
    int idx = 0;
    for (int day = 1; day <= D; day++) {
        if (day == D && idx < N) {
            while (idx < N) {
                if (record) {
                    assign[idx] = day;
                }
                cur += H[idx];
                idx++;
            }
        } else {
            while (cur < x && idx < N) {
                if (record) {
                    assign[idx] = day;
                }
                cur += H[idx];
                idx++;
            }
        }
        if (cur < x) {
            return false;
        }
        if (day < D) {
            cur = cur / 2; 
        }
    }
    return true;
}

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

    cin >> N >> D;
    ll sum = 0;
    for (int i = 0; i < N; i++) {
        cin >> H[i];
        sum += H[i];
    }
    ll l = 0, r = sum;
    while (l < r) {
        ll mid = (l + r + 1) / 2;
        if (check(mid, false)) {
            l = mid;
        } else {
            r = mid - 1;
        }
    }
    cout << l << endl;
    check(l, true);
    for (int i = 0; i < N; i++) {
        cout << assign[i] << '\n';
    }

    return 0;
}

include

include

using namespace std;

typedef long long ll; const int maxn = 50010; int N, D; ll H[maxn]; int assign[maxn]; bool check(ll x, bool record = false) {

if (x == 0) {
    if (record) {
        for (int i = 0; i < N; i++) {
            assign[i] = 1;
        }
    }
    return true;
}

ll cur = 0; 
int idx = 0;
for (int day = 1; day <= D; day++) {
    if (day == D && idx < N) {
        while (idx < N) {
            if (record) {
                assign[idx] = day;
            }
            cur += H[idx];
            idx++;
        }
    } else {
        while (cur < x && idx < N) {
            if (record) {
                assign[idx] = day;
            }
            cur += H[idx];
            idx++;
        }
    }
    if (cur < x) {
        return false;
    }
    if (day < D) {
        cur = cur / 2; 
    }
}
return true;

}

int main() {

ios::sync_with_stdio(false);
cin.tie(nullptr);

cin >> N >> D;
ll sum = 0;
for (int i = 0; i < N; i++) {
    cin >> H[i];
    sum += H[i];
}
ll l = 0, r = sum;
while (l < r) {
    ll mid = (l + r + 1) / 2;
    if (check(mid, false)) {
        l = mid;
    } else {
        r = mid - 1;
    }
}
cout << l << endl;
check(l, true);
for (int i = 0; i < N; i++) {
    cout << assign[i] << '\n';
}

return 0;

}



评论:

请先登录,才能进行评论