NC224938 加减

题目

题目描述

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

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

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

输入描述

第一行两个正整数 \(n\) 和 \(k\)

第二行有 \(n\) 个正整数 \(a_i\)

\(1 \leq n \leq 10^5\)

\(1 \leq k \leq 10^{12}\)

\(1 \leq a_i \leq 10^9\)

输出描述

不超过 \(k\) 次操作之后,数组中可能出现最多次数元素的次数。

示例1

输入

5 3
6 3 20 8 1

输出

2

说明

共 3 次操作如下:

第一个数加一。

第二个数加一。

第四个数减一。

数组变成了 \(7,4,20,7,1\) ,共有 \(2\) 个相同的数:\(7\) 。

可以证明,\(2\) 为最优解。另外,此上操作并不是唯一的操作。

题解

思路

知识点:二分+前缀和+尺取法

排序好数列中,若要构成相同的数字,那么构成子串是同样情况下花费次数最少的,因此考虑遍历所有左端点,且每次左移左端点不需要回调右端点,因为左移端点后区间长度一定小于等于原来合法最大值,就算区间内有合法右端点但也不可能更新最大值,所以不考虑回调。(尺取法)

在同一个区间所有数字离中位数最近,消耗次数最小,偶数区间中间两个数字选取等价。(二分)

为了方便计算某区间的消耗,需要预处理出排序好后的前缀和。(前缀和)

时间复杂度 \(O(nlogn)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; ll a[100007],s[100007]; int main(){
std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
ll n,k;
cin>>n>>k;
for(int i = 1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i = 1;i<=n;i++){
s[i] = a[i] + s[i-1];
}
int l = 1,r = 1;
int ans = 0;
///排序好数列中,若要构成相同的数字,那么构成子串是同样情况下花费次数最少的。
///因此考虑遍历所有左端点,且每次左移左端点不需要回调右端点,因为左移端点后区间长度一定小于等于原来合法最大值,就算区间内有合法右端点但也不可能更新最大值,所以不考虑回调。
while(l<=n){
while(r<=n){
int mid = l+r>>1;///在同一个区间所有数字离中位数最近,消耗次数最小,偶数区间中间两个数字选取等价
if((mid-l)*a[mid]-(s[mid-1]-s[l-1]) + (s[r]-s[mid]) - (r-mid)*a[mid]>k) break;
r++;
}
ans = max(ans,r-l);
l++;
}
cout<<ans<<'\n';
return 0;
}

NC224938 加减的更多相关文章

  1. Android带加减的edittext

    看了网上这样自带加减的edittext写得好复杂,还有各种监听事件,我觉得没有必有.于是我自己写了一个. 我这个edittext仅仅限制整数,每次加减1. public class TestEditT ...

  2. js实现输入框数量加减【转】

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 自己动手丰衣足食之 jQuery 数量加减插件

    引言 做一个手机端的订单相关项目中,其中下订单时需要用到数量加减的控件,可以设置默认值,也可以设置最大值和最小值.使用jQuery这么长时间了,平时很少去编写属于自己的插件,现在编写的时候对立面的一些 ...

  4. php 时间加减

    <?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time() ...

  5. freemarker 数据做加减计算

    controller的部分: @Controller@RequestMapping("/ContactsFrameIndex")public class ContactsFrame ...

  6. Oracle中的日期加减

    加法   select sysdate,add_months(sysdate,12) from dual;        --加1年 select sysdate,add_months(sysdate ...

  7. php如何在某个时间上加一天?一小时? 时间加减

    <?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time() ...

  8. 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)

    之前在写详情页的时候,如下图 因为自己嫌麻烦,就去看其他网站是怎么写的,想直接拿来用,后来看来看去觉得写得很麻烦,于是最后还是决定自己写,附上HTML+CSS+JS代码,一条龙一站式贴心服务2333 ...

  9. Delphi日期函数、日期加减

    Delphi里有现成的函数可以实现日期加减,是在DateUtils单元里的. function IncYear(const AValue: TDateTime; const ANumberOfYear ...

随机推荐

  1. 在C#中使用 SendMessage 实现操作外部其他程序上的控件教程

    一.C#代码实现 本案例使用的是c# winform .NET Framework 4.7.2 首先我们声明一个寻找窗体的函数 [DllImport("User32.dll", E ...

  2. FreeRTOS --(0)简介

    转载自https://blog.csdn.net/zhoutaopower/article/details/106541595 FreeRTOS 是一个嵌入式实时操作系统,具有相对(相对 Linux. ...

  3. ucore lab7 同步互斥机制 学习笔记

    管程的设计实在是精妙,初看的时候觉得非常奇怪,这混乱的进程切换怎么能保证同一时刻只有一个进程访问管程?理清之后大为赞叹,函数中途把前一个进程唤醒后立刻把自己挂起,完美切换.后一个进程又在巧妙的时机将自 ...

  4. 4 个超实用的 Linux 监控工具

    公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 下面是 Linux 下 4 个日常使用率非常高的监控工具,可以帮助我们准确快速的诊断系统问题. 1. iotop 如果你想知 ...

  5. java高级用法之:绑定CPU的线程Thread-Affinity

    目录 简介 Java Thread Affinity简介 AffinityLock的使用 使用API直接分配CPU 总结 简介 在现代计算机系统中,可以有多个CPU,每个CPU又可以有多核.为了充分利 ...

  6. 【算法】选择排序(Selection Sort)(二)

    选择排序(Selection Sort) 选择排序(Selection-sort)是一种简单直观的排序算法.它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余 ...

  7. unity---对象池

    当内存占满了,GC会自动清理内存 优化方法:对象池 Invoke("Push",1);//延迟一秒时间调用 高级缓存池 小池子 大池子

  8. 《回炉重造 Java 基础》——集合(容器)

    整体框架 绿色代表接口/抽象类:蓝色代表类. 主要由两大接口组成,一个是「Collection」接口,另一个是「Map」接口. 前言 以前刚开始学习「集合」的时候,由于没有好好预习,也没有学好基础知识 ...

  9. 《Unix 网络编程》08:基本UDP套接字编程

    基本UDP套接字编程 系列文章导航:<Unix 网络编程>笔记 UDP 概述 流程图 recvfrom 和 sendto #include <sys/socket.h> ssi ...

  10. 优秀开源平台,前后端分离快速开发平台,一站式多端开发(PC+APP)

    JNPF平台架构介绍 JNPF快速开发平台采用前后端分离技术.采用B/S架构开发,形成一站式开发多端(APP+PC)使用. PC端版本介绍 第一个当然是当下热门的.net core了,运行环境为Vis ...