咲ら • 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;
}
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;
}
评论:
请先登录,才能进行评论