题解 | #andy的树被砍了#

andy的树被砍了

https://ac.nowcoder.com/acm/problem/50048

我来一个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;

}

全部评论

相关推荐

03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务