OJ练习之加减(中等偏难)

加减

题号:NC224938

时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒

空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M

64bit IO Format: %lld

题目描述

小红拿到了一个长度为 n 的数组。她每次操作可以让某个数加 1 或者某个数减 1 。

小红最多能进行 k 次操作。她希望操作结束后,该数组出现次数最多的元素次数尽可能多。

你能求出这个最大的次数吗?

输入描述:

复制代码
第一行两个正整数 n 和 k
第二行有 n 个正整数 ai

1≤n≤10^5
1≤k≤10^12
1≤ai≤10^9

输出描述:

复制代码
不超过 k 次操作之后,数组中可能出现最多次数元素的次数。

示例1

输入

复制代码
5 3
6 3 20 8 1

输出

复制代码
2

说明

复制代码
共 3 次操作如下:
第一个数加一。
第二个数加一。
第四个数减一。
数组变成了 7 4 20 7 1 ,共有 2 个相同的数: 7 。
可以证明, 2 为最优解。另外,此上操作并不是唯一的操作。 

题解(前缀和+滑动窗口+贪心):

cpp 复制代码
#include <iostream>
#include <algorithm>
using namespace std;

// k已经超出了int的范围,ai涉及到加减操作,很容易超出int范围,所以直接使用long long
typedef long long LL;
const int N = 1e5 + 10;

LL n,k;

LL arr[N];
LL sum[N];

LL cal(int left,int right)
{
    // 选取区间内中间下标,对于区间内偶数个来说,选中间两个的任意一个结果都一样
    int mid = (left+right)/2;
    // 区间内:mid左边的个数×a[mid]-mid左边的和+mid右边和和 - mid右边的个数×a[mid]
    return (mid-left)*arr[mid] - (sum[mid-1]-sum[left-1]) + (sum[right]-sum[mid]) - (right-mid)*arr[mid]; // 根据规律,总结出的公示可以直接O(1)出结果
}

int main()
{
    cin >> n>>k;
    // 将n个数存入,从下标1开始存入
    for(int i = 1;i<=n;i++) cin >> arr[i];
    // 将n个数按照从小到大排序
    sort(arr+1,arr+1+n);
    // 将前i个数的和按照对应下标存入sum数组里备用
    for(int i = 1;i<=n;i++) sum[i] = sum [i-1]+arr[i];
  
    int left = 1,right = 1;
    int ret  = 1; // 根据题意,ret最小也是1
    
    while(right<=n)
    {
        // cal用来获取将区间所有数都变成同一个数的最小加减次数,即最小代价
        LL cost = cal(left,right);
        while(cost > k) // 如果最小代价比规定的都大,继续寻找更小的可能
        {
            left++; // 再扩大区间代价还会增大,要让left右移
            cost = cal(left,right);  
        }
        // 更新ret
        ret = max(ret ,right-left+1); // 当然选择满足的区间差值最大的
        right++; // 继续尝试寻找更优解
    }
    
    cout << ret<<endl;
    
    return 0;
}
相关推荐
青少儿编程课堂3 小时前
蓝桥杯青少组 + 全国青少年信息素养大赛 + 电子学会图形化考级|校园推箱子大挑战解析
c++·python·算法·bfs·信息学竞赛
多弗朗皮卡丘4 小时前
C++STL之空间配置器
开发语言·c++·内存池·空间配置器
牵猫散步的鱼儿4 小时前
Demosaic 和 Remosaic
c++
CodeYp20194 小时前
第19讲:封装红黑树实现 mymap 和 myset
开发语言·c++·红黑树
孙鹏宇.4 小时前
C++类型转换
c++
超级架构师5 小时前
让 COBOL 长出 AI 大脑:原生 Agent 核心框架 praxo-core 深度剖析
c语言·开发语言·c++·人工智能·python·架构·ai编程
·present·5 小时前
CSAPP(lecture 10)
c语言·c++
YLCHUP5 小时前
【模拟&STL】题解:AT_abc203_e [ABC203E] White Pawn_基础算法_数据结构_STL模板库_AtcoderABC_C++算法竞赛
数据结构·c++·算法·leetcode·动态规划·哈希算法·近邻算法
xiaolang_8616_wjl5 小时前
c++游戏_宝可梦大世界(源代码)
开发语言·c++·游戏
余额瞒着我当琳6 小时前
C++异常,异常的概念,异常抛出与捕获,RAII 和智能指针的设计思路,C++标准库一些指针的使用
java·开发语言·c++·算法