【拼多多】20250309笔试真题第2题记录

一开始想到的是用DP解,没成功,后来又用了前缀和/后缀和也不对

我去网上找题解,看到了一个不错的题解,代码量不大,但是相应的解释太少了,我就自己琢磨

好歹也是把思路理清了,附上代码

菜就多练

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

int main(int argc, char const* argv[]) {
    // 5
    // 1 -4 10 -30 2
    // prefix = {1, -3, 7, -23, -21}
    // min_prefix = {1, -3, -3, -23, -23}
    // max_prefix = {1, 1, 7, 7, 7}
    long long ans = 0;
    int n = 0;
    cin >> n;
    vector<int> step(n);
    vector<long long> prefix(n + 1);
    vector<long long> min_prefix(n + 1);
    vector<long long> max_prefix(n + 1);
    // 不使用传送门, ans = max(abs(prefix[i])) 即prefix[]数组元素绝对值的最大值
    // 使用传送门, 假设在 i 处使用了传送门, 在 j 处到达了了最远位置, 可以表示为
    // -prefix[i] + (prefix[j] - prefix[i]), 其中(prefix[j] - prefix[i])表示step[i...j]的区间和
    // -prefix[i] + (prefix[j] - prefix[i]) = prefix[j] - 2*prefix[i]
    // 那么距离为 abs(prefix[j] - 2*prefix[i]), 这里有限制条件(j > i), 问题转化为求这个表达式的最大值
    // 暴力遍历会超时, 优化一下怎么求最大值
    // 在一次遍历中, prefix[k]是确定的
    // 数学表达式 |a - b| = |b - a|, 固定 a 不变, 当 b 取最大或最小值时可以使得 |a - b|最大
    // 由于 j > i, 相当于求在 j 位置之前的最小/最大前缀和
    // 也就是[1, j]区间上最小/最大的前缀和, 注意这里的 j 不是固定的, 而是会变化的
    // 所以可以遍历prefix[]数组, 随着 j 的位置变化, 最小/最大前缀和会变, 需要 2 个数组来维护
    for (int i = 1; i <= n; i++) {
        cin >> step[i];
        prefix[i] = prefix[i - 1] + step[i];
        ans = max(ans, abs(prefix[i]));
        if (i == 1) {
            min_prefix[i] = max_prefix[i] = prefix[i];
        }
        else {
            min_prefix[i] = min(min_prefix[i - 1], prefix[i]);
            max_prefix[i] = max(max_prefix[i - 1], prefix[i]);
        }
    }
    // 按顺序走传送门
    for (int i = 1; i <= n; i++) {
        long long max1 = abs(prefix[i] - 2*min_prefix[i]);
        long long max2 = abs(prefix[i] - 2*max_prefix[i]);
        ans = max(ans, max(max1, max2));
    }
    cout << ans << endl;
    // system("pause");
    return 0;
}

全部评论
已老实
点赞 回复 分享
发布于 03-20 23:18 江苏

相关推荐

3.1&nbsp;同步和异步渲染Fiber&nbsp;允许&nbsp;React&nbsp;同时处理多个渲染更新。通过将任务分解为小任务,React&nbsp;可以在不冻结用户界面的情况下进行异步渲染。这意味着在避免长时间更新的同时,可以快速响应用户操作。3.2&nbsp;优先级控制Fiber&nbsp;引入了优先级系统,可以根据任务的重要性来调度渲染。例如,用户输入的更新被赋予更高的优先级,相比于不重要的更新,优先处理。3.3&nbsp;灵活的任务取消Fiber&nbsp;允许&nbsp;React&nbsp;在不需要当前任务的情况下轻松取消和恢复任务。例如,用户快速切换组件时,React&nbsp;可以取消当前的长时间渲染,直接开始渲染新的组件。4.&nbsp;Fiber&nbsp;带来的优势流畅的用户体验:通过可中断的渲染和优先级调度,Fiber&nbsp;能够处理复杂&nbsp;UI&nbsp;和动画,提供更为流畅的用户体验。响应性:在长时间的计算期间,React&nbsp;仍然能够响应用户的输入,将优先级较高的任务(如用户输入)优先处理。性能优化:对任务的划分和调度使得&nbsp;React&nbsp;能够减少不必要的渲染,提高应用的响应速度和性能。总结Fiber&nbsp;是&nbsp;React&nbsp;核心算法中的重要更新,它通过引入更为灵活的任务调度和优先级控制,提升了&nbsp;React&nbsp;的渲染性能和用户体验。随着&nbsp;Web&nbsp;应用规模的不断扩大,Fiber&nbsp;为开发者提供了更强大的工具来构建复杂、动态的用户界面,同时保持良好的性能和响应性。https://www.nowcoder.com/issue/tutorial?zhuanlanId=j572L2&amp;amp;uuid=ad4c96561557439591c01368cbe8144a#牛客AI配图神器#
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

更多
牛客网
牛客企业服务