我来一个C语言的题解
#include <stdio.h> #include <stdlib.h>
int main() { int n; scanf("%d", &n);
int* h = (int*)malloc(n * sizeof(int));
int* c = (int*)malloc(n * sizeof(int));
int* d = (int*)malloc(n * sizeof(int));
// 读取输入
for (int i = 0; i < n; i++) {
scanf("%d", &h[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &c[i]);
}
// 前缀和数组,prefix_sum[i]表示前i+1天的砍伐量之和
long long* prefix_sum = (long long*)malloc((n + 1) * sizeof(long long));
prefix_sum[0] = 0;
for (int i = 1; i <= n; i++) {
prefix_sum[i] = prefix_sum[i - 1] + c[i - 1];
}
// 对于每棵树,二分查找死亡天数
for (int i = 0; i < n; i++) {
int left = i, right = n - 1;
int death_day = n + 1;
while (left <= right) {
int mid = left + (right - left) / 2;
// 计算从第i天到第mid天的累计砍伐量
long long total_cut = prefix_sum[mid + 1] - prefix_sum[i];
if (total_cut >= h[i]) {
death_day = mid + 1;
right = mid - 1;
}
else {
left = mid + 1;
}
}
d[i] = death_day;
}
// 输出结果
for (int i = 0; i < n; i++) {
printf("%d ", d[i]);
}
printf("\n");
free(h);
free(c);
free(d);
free(prefix_sum);//注意free
return 0;
}

京公网安备 11010502036488号