NC224938 加减
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 加减的更多相关文章
- Android带加减的edittext
看了网上这样自带加减的edittext写得好复杂,还有各种监听事件,我觉得没有必有.于是我自己写了一个. 我这个edittext仅仅限制整数,每次加减1. public class TestEditT ...
- js实现输入框数量加减【转】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 自己动手丰衣足食之 jQuery 数量加减插件
引言 做一个手机端的订单相关项目中,其中下订单时需要用到数量加减的控件,可以设置默认值,也可以设置最大值和最小值.使用jQuery这么长时间了,平时很少去编写属于自己的插件,现在编写的时候对立面的一些 ...
- php 时间加减
<?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time() ...
- freemarker 数据做加减计算
controller的部分: @Controller@RequestMapping("/ContactsFrameIndex")public class ContactsFrame ...
- Oracle中的日期加减
加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_months(sysdate ...
- php如何在某个时间上加一天?一小时? 时间加减
<?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time() ...
- 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)
之前在写详情页的时候,如下图 因为自己嫌麻烦,就去看其他网站是怎么写的,想直接拿来用,后来看来看去觉得写得很麻烦,于是最后还是决定自己写,附上HTML+CSS+JS代码,一条龙一站式贴心服务2333 ...
- Delphi日期函数、日期加减
Delphi里有现成的函数可以实现日期加减,是在DateUtils单元里的. function IncYear(const AValue: TDateTime; const ANumberOfYear ...
随机推荐
- Java函数的学习
函数的定义 - 定义的位置:定义在类的内部 - 组成部分: 函数修饰符 类型 函数名(形式参数){ 局部变量: 注释: 函数体: } 函数的调用 - 调用函数时使用 : `函数名():` - 函数在执 ...
- nginx wordpress安装
BEGIN; 最近在弄wordpress,然后环境是centOS6.3,使用nginx做web服务器. 经过一系列安装,nginx.mysql.php都安装成功了,然后在配置nginx访问wordpr ...
- js 如何判断变量类型
自定义一些类型 const boolean = true const string = '这是一个字符串' const number = 1 const array = [] const object ...
- CSS展开收起
有一个问题是,在上述例子中,把段落内容的"浮动元素"去掉后,段落最后从"行"字开始换行了,"收起"却不换行,也就是会存在有两个字内容看不见情 ...
- 开源框架 WebFirst 一键生成项目,在线建表
1.WebFirst框架描述 WebFirst 是果糖大数据团队开发的新一代 高性能 代码生成器&数据库设计工具,由.net core 3.1 + sqlsugar 开发 导入1000个表只 ...
- 使用NE555实现的延时开关电路
NE555 的工作机制 先了解 NE555 的 Trigger(Pin2) 和 Threshold(Pin6) 如何检测电压并控制输出 如果 Trigger(Pin2) 检测到任何低于电源电压1/3的 ...
- python 动态规划(背包问题和最长公共子串)
背包问题 现在要往一个可以装4个单位重量的背包里怎么装价值最高:A重量1个单位,价值15:B重量3个单位,价值20:C重量4个重量,价值30 使用动态规划填充空格 class SolutionBag: ...
- JavaScript 单线程之异步编程
Js 单线程之异步编程 先了解一个概念,为什么 JavaScript 采用单线程模式工作,最初设计这门语言的初衷是为了让它运行在浏览器上面.它的目的是为了实现页面的动态交互,而交互的核心是进行 Dom ...
- MySQL用户管理与字符集
用户管理与字符集 一.用户管理 用户名的概念 用户名是由两部分组成的 user和host 1.1 创建用户 create user 'yysue'@'192.168.5.38' identified ...
- unity---判断物体碰撞的对象
脚本效果 trrn对象为地面,排除这个选项