C. Set or Decrease(二分 + 有两个不确定情况如何二分)

news2024/10/6 2:22:09

Problem - 1622C - Codeforces

给你一个整数数组a1,a2,...,an和整数k。

在一个步骤中,你可以

选择某个索引i并将ai减少1(使ai=ai-1)。
或者选择两个索引i和j,将ai等于aj(使ai=aj)。
为了使数组∑i=1nai≤k的总和,你需要的最小步骤数是什么?(你可以使数组的值为负数)。

输入
第一行包含一个整数t(1≤t≤104)--测试案例的数量。

每个测试用例的第一行包含两个整数n和k (1≤n≤2⋅105; 1≤k≤1015) - 数组a的大小和其总和的上限。

每个测试案例的第二行包含n个整数a1,a2,...,an(1≤ai≤109)--数组本身。

保证所有测试用例的n之和不超过2⋅105。

输出
对于每个测试案例,打印一个整数--使∑i=1nai≤k的最小步骤数。

例子
inputCopy
4
1 10
20
2 69
6 9
7 8
1 2 1 3 1 2 1
10 1
1 2 3 1 2 6 1 6 8 10
输出拷贝
10
0
2
7
注意
在第一个测试案例中,你应该将a1减少10倍以得到低于或等于k=10的和。

在第二个测试案例中,数组a的总和已经小于或等于69,所以你不需要改变它。

在第三个测试案例中,你可以,例如。

设置a4=a3=1。
将a4减少1,得到a4=0。
结果,你会得到数组[1,2,1,0,1,2,1],在1+1=2步中,总和小于或等于8。
在第四个测试案例中,你可以,例如。

选择a7并减少3次;你会得到a7=-2。
选择4个元素a6、a8、a9和a10,它们等于a7=-2。
结果,你会得到数组[1,2,3,1,2,-2,-2,-2,-2,-2],在3+4=7步中,总和小于或等于1。

题解:
首先我们要明白要想操作数最小我们应该怎么做

1.让最小的-1

2.让最大的几个数等于最小的

很明显我们应该进行操作1,减到一定数值后再进行操作二最优

关键是我们如何确定要进行多少次操作1呢?

我们发现进行操作2次数顶多n - 1次

那么我们就二分总次数

遍历0~min(n-1,mid)

 一部分进行操作1,一部分进行操作2即可

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define int long long
int a[200050];
int b[200050];
int n,k;
int check(int x)
{
	for(int i = 0;i <= min (x,n-1);i++)//进行操作2的次数
	{
		int mi = a[n] - (x-i);//(x-i)为进行操作1的次数
		int s = b[n-1] - b[i] + (i+1)*(mi);//i+1是前面i个数,是根据第n个数变化的
		if(s <= k)
		return 1; 
	}
	return 0;
}
void solve()
{
	cin >> n >> k;
	int s = 0;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
		s += a[i];
	}
	sort(a+1,a+1+n,greater<int>());
	for(int i = 1;i <= n;i++)
	b[i] = b[i-1] + a[i];
	if(s <= k)
	{
		cout<<"0\n";
		return ;
	}
	int l = 0,r = s - k;
	while(l <= r)
	{
		int mid = (l + r)/2;
		if(check(mid))
		{
			r = mid - 1;
		}
		else
		{
			l = mid + 1;
		}
	}
	cout<< l<<"\n";
}
signed main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);
	int t = 1;
	cin >> t;
	while(t--)
	{
		solve();
	}
}

//1 10 11

//001
//010
//011
//100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

启动服务提供者报 zookeeper not connected错

今天启动zookeeper的服务提供者后&#xff0c;报 zookeeper not connected错&#xff0c;记录一下解决过程 意思是zookeeper注册中心连接不上&#xff0c;无非两个原因&#xff1a; 第一&#xff1a;zookeeper没有启动好。第二&#xff1a;zookeeper的ip以及端口号配置没配好 …

算法day35|860,406,452

目录 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球 860.柠檬水找零 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:five,ten,twenty 0,0,0for bill in bills:#情况一&#xff1a;如果bills是5元&#xff0c;不需要找零if bill…

黑马点评--附近商铺

附近商铺 GEO数据结构 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本加入了对GEO的支持&#xff0c;允许存储地理坐标消息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a; GEOADD&#xff1a;添加一个地理空间信息&#xff0…

gcexcel-java-5.2.5 Crack update in 2022-11-28

gcexcel高速 Java Excel 电子表格 API 库 在 Java 应用程序中以编程方式创建、编辑、导入和导出 Excel 电子表格。几乎可以在任何地方部署。 创建、加载、编辑和保存 Excel 电子表格 保存为 .XLSX、PDF、HTML、CSV 和 JSON 基于具有零 Excel 依赖性的 Excel 对象模型 在本地、…

Tomcat负载均衡部署动静分离

NginxTomcat架构拓扑 环境部署 Nginx服务器&#xff1a;IP地址192.168.32.3 Tomcat服务器1&#xff1a;IP地址192.168.32.4 Tomcat服务器2&#xff1a;IP地址192.168.32.5 关闭防火墙&#xff0c;关闭开机自启 systemctl stop firewalld.service setenforce 0Nginx 主机安…

计算机组成原理习题课第三章-1(唐朔飞)

计算机组成原理习题课第三章-1&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

高电压放大器与高电流放大器该如何选择使用

虽然电压放大器和电流放大器都属于功率放大器的分支类型&#xff0c;所能起到的效果和作用也都是一致的&#xff0c;不过两者还是细微差别的。经常会有人在后台咨询“电压放大器和电流放大器有什么区别&#xff0c;该如何选择使用”等等&#xff0c;针对这些疑问&#xff0c;今…

zynq实现视频动态字符叠加OSD,提供2套工程源码和技术支持

目录1.网上同行的OSD方案(太low)2.本方案OSD的优势3.HLS实现方案4.OSD延时和资源占用情况5.工程1&#xff1a;zynq7100实现字符叠加6.上板调试验证7.福利&#xff1a;工程源码获取1.网上同行的OSD方案(太low) 视频的字符叠加&#xff0c;简称OSD&#xff0c;是FPGA图像处理的基…

PG::Vegeta1

nmap -Pn -p- -T4 --min-rate1000 192.168.201.73 nmap -Pn -p 22,80 -sCV 192.168.201.73 查看80端口的服务。 没有发现可用的信息&#xff0c;尝试爆破路径。 gobuster dir -e -w /usr/share/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-big.txt -u htt…

年薪50W的数字前端设计工程师是做什么的?

近两年&#xff0c;芯片行业大火&#xff0c;行业的发展受到了很大的政策支持&#xff0c;芯片行业不仅发展前景好&#xff0c;薪资待遇也很高&#xff0c;所以不少人纷纷转行IC&#xff0c;那么转行IC岗位该如何选择呢&#xff1f;下面IC修真院就重点为大家来介绍一下数字前端…

【Android App】检查手机连接WiFi信息以及扫描周围WiFi的讲解及实战(附源码和演示 超详细必看)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 一、检查是否连接WiFi以及输出WiFi信息 传统的定位方式不适用于室内的垂直定位&#xff0c;原因如下&#xff1a; &#xff08;1&#xff09;卫星定位要求没有障碍物遮挡&#xff0c;它在户外比较精准&#xff0c;在室内信号就…

【Canvas】js用canvas绘制一个钟表时钟动画效果

学习JavaScript的看过来&#xff0c;有没有兴趣用Canvas画图呢&#xff0c;可以画很多有趣的事物&#xff0c;自由发挥想象&#xff0c;收获多多哦&#xff0c;旋转角度绘图这个重点掌握到了吗&#xff0c;这里有一个例子&#xff0c;如何用canvas画钟表时钟动图效果&#xff0…

Mybatis:快速搭建Mybatis(2)

快速搭建Mybatis搭建Mybatis目录框架步骤一&#xff1a;创建Maven工程步骤二&#xff1a;创建mybatis的核心配置文件步骤三&#xff1a;创建mapper接口步骤四&#xff1a;创建Mybatis的映射文件步骤四&#xff1a;通过junit测试增删改查功能步骤五&#xff1a;加入logback日志功…

【JavaSE】String类型

目录 1. Java中为何要有 String 类&#xff1f; 2. String 类中的常用方法 2.1 String 类中的构造方法 2.2 String 类对象的比较 2.2.1 比较是否引用同一个对象 2.2.2 使用 equals 方法 2.2.3 compareTo 方法 2.3 字符串的查找 2.4 字符串与别的数据类型的转换 2.4.1 数值和字…

RationalDMIS 2022位置度评价,轮廓度评价时, 元素理论值变了,如何一劳永逸解决!

1,几何尺寸和公差符号 2.通用尺寸公差符号 3.位置度(Position) 位置度的被测要素有点、直线和平面,基准要素主要有直线和平面。给定位置度的被测要素相对于基准要素必须保持图样给定的正确位置关系,被测要素相对于基准要素的正确位置关系应由基准要素和理论正确尺寸来…

python mitmproxy +雷电模拟器 安装

第一步 安装mitmproxy 首先在安装好python 的情况下 pip install mitmproxy 第二步 电脑端安装证书 进入这个目录下 如果没有就重新mitmproxy 点击mitmproxy-ca.p12&#xff0c;在电脑端安装证书 点击下一页 点击下一页 不用管密码直接下一页 按照途中选择&…

基于Spring更简单的读取和存储对象

在spring的创建和使用这篇博客中有讲到关于Spring存储和读取Bean对象的操作,但是细心的朋友有没有发现那些操作没有想象中的简单呢?所以呀,我今天要给朋友分享的是更简单的存储和读取Bean对象的方法,快来看看吧~ 在Spring中想要更简单的存储和读取对象的核心就是使用注解,这就…

蓝牙学习四(广播)

1.简介 什么叫做广播&#xff0c;顾名思义就像广场上的大喇叭一样&#xff0c;不停的向外传输着信号。不同的是&#xff0c;大喇叭传输的是音频信号&#xff0c;而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息&#xff0c;就是将数据编码&#xff0c;调制到射频信号中发…

cmake使用

1. cmake概述及例子 CMake快速入门 cmake、qmake、cl之间关系 1.1 各种cmake cmake根据CMakeLists.txt生成makefile&#xff0c;make根据makefile行编译。 1.1.1 最简cmake&#xff1a;生成可执行程序&#xff08;一个文件&#xff09; #CMakeLists.txt cmake_minimum_req…

【正点原子FPGA连载】 第二十章 LCD触摸屏实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十章 LCD触摸…