【错题集-编程题】加减(枚举 + 前缀和 + 滑动窗口 + 贪心)

牛客对应题目链接:加减 (nowcoder.com)


一、分析题目

  1. 贪心:尽可能选择一些挨得比较近的数,让他们变成相同的数(排序)。前缀和可以从 O(N) 变到 O(1)。
  2. 枚举所有的区间,找出区间内所有数变成相同的数的最小代价 cost <= k 的最大区间。滑动窗口可以从 O(N^2) 变到 O(N)。
  3. 如何求一个区间的最小 变到代价 cost。(转化成数学问题:数轴上有一些点,选取一个位置,使得所有点到它的距离之和最小)

结论:选择最中间的点。


二、代码

// 值得学习的代码
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 1e5 + 10;

LL n, k;
LL arr[N];
LL sum[N]; // 前缀和数组

LL cal(int l, int r)
{
    int mid = (l + r) / 2;
    return (mid - l - r + mid) * arr[mid] - (sum[mid - 1] - sum[l - 1]) + (sum[r] - sum[mid]);
}

int main()
{
    cin >> n >> k;
    for(int i = 1; i <= n; i++) cin >> arr[i];
    sort(arr + 1, arr + 1 + n);
    // 初始化前缀和数组
    for(int i = 1; i <= n; i++) sum[i] = sum[i - 1] + arr[i];
 
    int left = 1, right = 1, ret = 1;
    while(right <= n)
    {
        // 进窗⼝
        LL cost = cal(left, right);
        while(cost > k) // 判断
        {
            left++; // 出窗⼝
            cost = cal(left, right);
        }
        // 更新结果
        ret = max(ret, right - left + 1);
        right++;
    }

    cout << ret << endl;
 
    return 0;
}

三、反思与改进

这道题目结合了好几个不同的知识点,后面需要重复练习,很锻炼代码能力,需要多做这种混合知识点的类型题。

相关推荐

  1. [做] 滑动窗口

    2024-07-13 05:50:03       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 05:50:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 05:50:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 05:50:03       58 阅读
  4. Python语言-面向对象

    2024-07-13 05:50:03       69 阅读

热门阅读

  1. QLabel控件

    2024-07-13 05:50:03       24 阅读
  2. deepstream读取mp4文件及不同类型视频输入bug解决

    2024-07-13 05:50:03       28 阅读
  3. samout 结构再优化 收敛速度再加快

    2024-07-13 05:50:03       25 阅读
  4. 延时订单的实现

    2024-07-13 05:50:03       28 阅读
  5. 数学基础 -- 三角学

    2024-07-13 05:50:03       27 阅读
  6. 07-7.5.2 散列函数的构造

    2024-07-13 05:50:03       27 阅读
  7. React vs Vue:谁是前端界的冠军?

    2024-07-13 05:50:03       24 阅读
  8. [NeetCode 150] Longest Consecutive Sequence

    2024-07-13 05:50:03       21 阅读
  9. sqlserver设置端口

    2024-07-13 05:50:03       22 阅读
  10. C++:using重新定义继承时访问权限

    2024-07-13 05:50:03       29 阅读
  11. git列出提交记录的文件路径

    2024-07-13 05:50:03       23 阅读
  12. 关于对于短视频的认识-复盘与再次复盘

    2024-07-13 05:50:03       23 阅读
  13. sqlalchemy反射视图

    2024-07-13 05:50:03       21 阅读
  14. vue 组件里面的方法修改外面的数据

    2024-07-13 05:50:03       25 阅读
  15. 使用Trie树高亮关键词

    2024-07-13 05:50:03       25 阅读
  16. qt 的布局

    2024-07-13 05:50:03       29 阅读
  17. 《每天十分钟》-红宝书第4版-函数

    2024-07-13 05:50:03       23 阅读
  18. 【Scrapy】Scrapy 中间件等级设置规则

    2024-07-13 05:50:03       25 阅读