每日一题:二分答案

2023-10-26

 二分答案 - 题目 - Daimayuan Online Judge

首先读入 n 和 k,然后读入序列 a。

接下来使用 l 和 r 表示最小值的猜测区间。由于题目中规定了最小值和元素范围,因此我们可以将上界设置为 1e18,下界设置为 1

二分查找的过程中,我们每次猜测一个中间值 mid,并判断是否满足条件(即 check 函数)。如果满足条件,说明当前的猜测值可能是答案,我们将猜测区间的左端点移动到 mid 上;否则,说明当前的猜测值不可能是答案,我们将猜测区间的右端点移动到 mid - 1 上

check 函数表示,对于当前猜测的最小值 x,统计一下将原序列中所有元素都变为 x 的最少操作次数 cnt,看看是否小于等于 k。具体地,如果 a[i] < x,那么我们需要对 a[i] 进行(x - a[i]) 次操作,否则不需要任何操作。

最终,l 就是答案

注意:区间上限r可以用1e13+1e8+10表示,也不用太大到1e18

判断cnt与k的大小关系,每次都要判断一次,否则如果r=1e18,取的中间值mid过大,数组a每个数和mid差的太大,全部的差加起来之后超过了long long范围,变成了负数,这样最后再判断的话,负数cnt肯定小于k,这样就出错了

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define int long long 
const int N = 100010;
int a[N];
int n, k;
bool check(int x) {
    int cnt = 0;
    for (int i = 1; i <= n; i++) {
        if (a[i] < x) {
            cnt += x - a[i];
            if (cnt > k) return false;
        }
    }
    return true;
}
signed main()
{
    cin >> n >> k;
    for (int i = 1; i <= n; i++) cin >> a[i];
    int l = 1, r = 1e18;
    while (l < r) {
        int mid = (l + r+1) / 2;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    cout << l << endl;
} 

if(check(mid))

l=mid or r=mid

最后统一写return l(事实上,r也行,因为最后l和r相等)

书写步骤:

先写上mid=l+r>>1;

然后写if(if里面都写答案所在的那个区间),根据if写l=mid还是r=mid

最后如果是l=mid,那么最前面变成mid=l+r+1>>1(防止死循环),如果是r=mid,那么前面仍然是l+r>>1(防止死循环)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每日一题:二分答案 的相关文章

  • VSTS 构建失败/发布无法在 bin 文件夹中找到 roslyn\csc.exe

    我们有一个网站项目 安装了以下 nuget 软件包 Microsoft CodeDom Providers DotNetCompilerPlatform 1 0 8 Microsoft Net Compilers 2 4 0 The web
  • 同步执行异步函数

    我对此主题进行了大量搜索 并且阅读了本网站上有关此主题的大部分帖子 但是我仍然感到困惑 我需要一个直接的答案 这是我的情况 我有一个已建立的 Winform 应用程序 但无法使其全部 异步 我现在被迫使用一个全部编写为异步函数的外部库 在我
  • 隐式方法组转换陷阱

    我想知道为什么给定代码的输出 在 LinqPad 中执行 void Main Compare1 Action Main Dump Compare2 Main Dump bool Compare1 Delegate x return x Ac
  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • 具有多重继承的类的 sizeof

    首先 我知道 sizeof 取决于机器和编译器的实现 我使用的是 Windows 8 1 x64 gcc 5 3 0 没有标志传递给编译器 我从大学讲座中得到了以下代码 include
  • C++ 私有静态成员变量

    此 C 代码在编译时产生链接器错误 A h class A public static void f private static std vector
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • 控制器中的异常处理 (ASP.NET MVC)

    当您自己的代码抛出异常并从控制器中的操作调用时 应该如何处理 我看到很多最佳实践的例子 其中根本没有 try catch 语句 例如 从存储库访问数据 public ViewResult Index IList
  • 如何附加到 xml

    我有这个xml
  • 如何用C++解析复杂的字符串?

    我试图弄清楚如何使用 解析这个字符串sstream 和C 其格式为 string int int 我需要能够将包含 IP 地址的字符串的第一部分分配给 std string 以下是该字符串的示例 std string 127 0 0 1 1
  • Active Directory UserPrincipal.Current.GetGroups() 返回本地组而不是 Web 服务器上的组

    以下内容在我的本地开发盒上效果很好 但是 当我将其移动到网络服务器时 它失败了 甚至不会记录错误 public static List
  • C 的“char”使用什么字符集? [复制]

    这个问题在这里已经有答案了 简单的问题 我最近开始用 C 编程 有一个简单的问题 C 编程语言在其 char 类型中使用什么字符集 例如 ASCII 还是取决于软件 操作系统 char 本质上是 1 个字节 主要在所有操作系统上 所以默认情
  • 如何从代码隐藏中向我的 div 添加点击事件?

    如何从代码隐藏中向我的 div 添加点击事件 当我点击 div 时 会出现一个消息框 其中显示 您想删除它吗 并在框中显示 是 或 否 全部来自后面的代码 while reader Read System Web UI HtmlContro
  • 我应该使用多个 HttpClient 来进行批量异步 GET 请求吗?

    我有一个场景 我需要在尽可能短的时间内发出大量 GET 请求 想想大约 1000 个 我知道通常最好保留一个客户端并尽可能重用它 Create Single HTTP Client HttpClient client new HttpCli
  • C 中什么函数可以替换字符串中的子字符串?

    给定一个 char 字符串 我想查找所有出现的子字符串并将其替换为备用字符串 我没有看到任何简单的函数可以实现这一点
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • FakeItEasy 代理方法调用实际实现

    我正在尝试将对假对象的调用代理到实际的实现 这样做的原因是我希望能够使用 Machine Specifications 的 WasToldTo 和 WhenToldTo 它们仅适用于接口类型的伪造 因此 我正在执行以下操作来代理对我的真实对
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码

随机推荐

  • 快速排序与快速选择

    快速排序算法就是将一列无序的数字排成有序 通过使用分治法 快速排序能够在O nlog n 的时间内完成 相比堆排序等其他也是O nlog n 复杂度的排序算法 快速排序的基数更小 因此效率也就越高 快速选择是在快速排序的基础上 在一列无序数
  • C语言中getchar()的用法详谈

    大多数人只看getchar 名字 以为其返回值是char 类型 但是getchar 的确不是char 类型 而是int 类型 其原型如下 int getchar void getchar有一个int型的返回值 当程序调用getchar时 程
  • 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度

    示例 1 输入 abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 bbbbb 输出 1 解释 因为无重复字符的最长子串是 b 所以其长度为 1 示例 3 输入 pwwkew 输出 3 解
  • 单元测试基础知识,面试用得上...

    1 什么是单元测试 在计算机编程中 单元测试又称为模块测试 是针对程序模块来进行正确性检验的测试工作 程序单元是应用的最小可测试部件 在过程化编程中 一个单元就是单个程序 函数 过程等 对于面向对象编程 最小单元就是方法 包括基类 抽象类
  • rocksdb 编译安装 日志

    Compilation RocksDB s library should be able to compile without any dependency installed although we recommend installin
  • 【面试专题】Spring篇②

    个人主页 个人主页 系列专栏 Java面试专题 目录 1 spring bean的循环依赖 2 springMVC执行流程 3 Springboot自动配置原理 4 Spring框架常见的注解 Spring SpringMVC Spring
  • channel的超时问题

    问题 并发编程的通信中 超时问题不可忽视 它指的是向channel写数据时发现channel已满 或者从channel尝试获取数据发现channel为空 如果不正确处理这些情况 很可能会导致整个goroutine锁死 i lt ch 不出问
  • Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++-4.2 failed with exit code 1问题总结及解决方案

    原文地址 http blog csdn net dream it life article details 5488121 最近因为需要 要用C C Objective C三种C语言3C混编的开发程序 在当然方法也和大家说一下吧 就是在Xc
  • 【PaddleDetection】基于PaddleDetection的齿轮瑕疵检测:从模型训练到部署中的那些坑

    目录 0 题目简介 1 Baseline项目的本地化 1 1 飞桨环境配置 飞桨安装注意事项 1 2 PaddleDetection安装 PaddleDetection注意事项 1 3 数据集下载与配置 PaddleX安装注意事项 1 4
  • windows下编译caffe

    windows在编译caffe有两种途径 第一直接从github上clone windows分支的源码 根据提供的cmakeLIsts开始编译 这种方法自由选择编译器 依赖的库文件版本等 可能自由度更大 但是也有比较多的问题 https g
  • 介绍Flex UI 测试工具:FlexMonkey

    相信许多人都知道Flex的单元测试工具 FlexUnit或者ASUnit 但是对于UI测试工具可能很少有人了解 那么目前有什么FlexUI测试工具呢 答案是FlexMonkey FlexMonkey是一个Flex应用的测试框架 他可以提供对
  • 交叉编译mbedtls

    交叉编译mbedtls 使用INTEL工具链编译 编译流程 编译成功文件默认的存放位置 使用mipsel 24kec linux uclibc工具链编译 编译流程 编译成功文件默认的存放位置 使用INTEL工具链编译 编译流程 make C
  • 最牛B的编码套路

    最近 我大量阅读了Steve Yegge的文章 其中有一篇叫 Practicing Programming 练习编程 写成于2005年 读后令我惊讶不已 与你所相信的恰恰相反 单纯地每天埋头于工作并不能算是真正意义上的锻炼 参加会议并不能锻
  • js 字符串函数总结(splice()、split()·····)

    1 自己比较易混淆的splice substring substr slice方法 第一个参数指定子字符串开始位置 第二个参数表示子字符串最后一个字符后面的位置 substring方法 第一个参数指定子字符串开始位置 第二个参数表示子字符串
  • C++执行程序的过程

    C 执行程序的过程 C 的源程序是以 cpp作为后缀的 C语言则是 c cpp保存也可以兼容 为了使计算机能够执行高级语言的代码 必须对源程序做个处理 用编译器把源程序处理成计算机可以识别的二进制目标程序 一般目标程序的后缀为 obj 编译
  • 新手必看,10个常见的Python运行时错误

    初入门的 Python小白 在运行代码时免不了会遇到一些错误 刚开始可能看起来比较费劲 随着代码量的积累 熟能生巧 当遇到一些运行时错误时能够很快的定位问题原题 我整理了常见的 10 个错误 希望能够帮助到大家 1 忘记在 if for d
  • C/C++将数据读写到指定地址

    0 背景 外设私有 内部 DMA在访问core内sram时 发现没有权限 也就是说 core不可作为slave设备被访问 导致外设的dma模式无法使用 但这并没有问题 我们可以将数据写到固定的地址 外部sram上 即可 下面介绍几种常用的方
  • 那个当年的三本学渣,为啥最后进了大厂?

    自我介绍 我是一名普通的三本大学生 自学开发 相继经历了接外包 创业 合伙人跑路等一系列事情 从一开始对于计算机的一无所知到现在拿到了一线互联网企业的special offer 磕磕碰碰 一路走来 可谓辛酸苦辣 大一小白 我就读的专业偏计算
  • ELK介绍及部署安装运用

    1 ELK简介 ELK表示 Elasticsearch Logstash Kibana 三个开源软件的缩写 是集成这三个软件于一体的日志分析及全文搜索解决方案 被广泛应用于实时日志处理 文档索引和搜索 以及数据的多维查询和统计分析等领域 数
  • 每日一题:二分答案

    二分答案 题目 Daimayuan Online Judge 首先读入 n 和 k 然后读入序列 a 接下来使用 l 和 r 表示最小值的猜测区间 由于题目中规定了最小值和元素范围 因此我们可以将上界设置为 1e18 下界设置为 1 二分查