首页 > 其他分享 >二分答案

二分答案

时间:2024-02-03 17:12:24浏览次数:32  
标签:二分 int res mid 答案 check

二分法简介

为一高效查找方法,将搜索范围一分为二。
适用于有序数据集合,利用单调性减少不必要的枚举。

解题步骤

研究数据结构的单调性。

确定最大区间[L,R],确保分界点一定在里头,若以R为答案,区间为[L+1,R](若为0到n,则L=-1,R=n),若以L为答案,答案区间为[L,R-1](同理)。
可以参照二分查找lower_bound()upper_bound()

确定check函数,一般传入mid,返回mid所属区域或返回一个值。

计算中点mid = (L+R)/2,用check判断该移动L或R指针。

二分答案

较为常见,需要发现某个单调的函数,然后对其二分。
常见模型:
二分框架 + check函数
一般对答案进行二分,然后在枚举出某个可能解后判断其是否可以更有或合法,从而不断逼近最优解。

模板

bool check(int mid){
	bool res = true;
	//do something to check the authority of mid...
	return res;
}

int main(){
	int l = 0, r = 1e9;
	while(l + 1 != r){
		int mid = (l + r) / 2;//先求中点
		//具体根据题意修改
		//或if(check(mid)<=m)之类的
		if(check(mid))l = mid;//根据check移动r或l
		else r = mid;
	}
	cout<< l << '\n';//具体输出啥根据题意判断
}

如最大的最近距离(最短距离最大是多少)。

例题

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 2*1e5 + 10;
int L, n, m;
int num[N] = { 0 };

int check(int mid) {//假设最大的最小值为mid,求删除的石头数目
	int res = 0, lst = 0;//删除的石头数量
	for (int i = 1; i <= n; i++) {
		if (num[i] - num[lst] < mid) {//lst表示上一个石头
			res++;//比最小值还小,删除这个石头,也就是i++,此时删除石头数增加
			continue;
		}

		lst = i;
	}
	if (L - num[lst] < mid)return m + 1;//最后一块不能删,区间太靠后了,让R=mid

	return res;
}

//分析易得以区间右边界R为答案,以[L+1,R]为区间
void ans() {
	cin >> L >> n >> m;
	for (int i = 1; i <= n; i++)cin >> num[i];

	int l = 0, r = 1e9 + 5;

	//二分长度区间
	while (l + 1 != r) {
		int mid = (l + r) / 2;//mid表示当前查找的值,目的是找到最大的最小值,mid一直接近于目标值
		if (check(mid) <= m)l = mid;//最小距离mid,移走的石头数check(mid)
		else r = mid;//R的check一直大于m,直到L=m右区间,R=L-1,输出L即答案区间的右边界
	}

	cout << l << '\n';
}

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T;// cin >> T;
	T=1;
	while (T--) {
		ans();
	}
	return 0;
}

标签:二分,int,res,mid,答案,check
From: https://www.cnblogs.com/breadcheese/p/18004963

相关文章

  • 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)
    【深基13.例1】查找题目描述输入个不超过的单调不减的(就是后面的数字不小于前面的数字)非负整数,然后进行次询问。对于每次询问,给出一个整数,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出。输入格式第一行个整数和,表示数字个数和询问次数。第二行......
  • 智慧树如何找答案?
    当代大学生面临着繁重的学业压力和海量的知识点,如何高效地进行学习和搜题成了他们关注的焦点。幸运的是,随着科技的不断进步,我们有越来越多的日常搜题和学习软件可以帮助我们更好地应对这些挑战。在本文中,我将为大家介绍10款备受大学生青睐的日常搜题和学习软件,帮助你们更轻松地掌握......
  • 如何手机搜高职单招答案?用这5款神器就够了!!!
    培养自己的阅读习惯,并不仅仅限于课外读物,还包括学术期刊、行业报告等,以不断提升自己的知识水平和思考能力。1.百词斩百词斩是针对英语学习开发的一款“图背单词软件”,软件为每一个单词提供了趣味的配图和例句,帮助用户在背单词时,建立关联记忆。我觉得百词斩用来记单词还比较好用,首先......
  • 社区工作搜题神器找答案?
    无论是在课堂上的难题还是独自自学时的疑问,作为大学生,我们需要掌握一些实用的日常搜题和学习软件,以便更加高效地解决问题和提升自己的学习成果。1.有道翻译有道翻译提供即时免费的中文、英语、日语、韩语、法语、德语、俄语、西班牙语、葡萄牙语、越南语、印尼语、意大利语、荷兰语......
  • 驾驶证如何找答案?
    学会运用各类学习辅助工具和资料,是大学生培养自主学习能力和信息获取能力的重要途径之一。1.颐博查题这是一个网站在线搜题、题目答案分享网站。是我用过最好用的搜题类网站,还有小程序、公众号,用起来十分方便,想用哪个就用哪个。而且每天都可以免费使用。2.大鱼搜题这是个微信公......
  • 二分查找!
    使用范围:查找元素:在有序数组中查找一个特定的元素。找到边界:查找有序数组中某个值的第一个或最后一个出现的位置。搜索旋转排序数组:在旋转排序数组中查找一个特定的元素。查找峰值元素:在数组中查找峰值元素。求平方根:计算一个非负整数的平方根。搜索区间:......
  • 青马在线试题答案?分享7个可以搜答案的软件
    这几搜题软件我身边的朋友也都在用,它拥有非常丰富的题库。收录国内高校常见的财会类、计算机类、医学类、资格类、学历类、外语类、工程类、建筑类等科目类型,不管是什么类型的题目都可以在这里找到答案。1.大鱼搜题这是一个公众号学生或者是成年人使用非常广的一款学习应用软件,里面......
  • 本科生题不会怎么搜答案?学生党都在用的五款搜题工具来了
    大学生搜题软件是一种方便快捷的工具,可以帮助大学生们在解答问题和完成作业时节省时间和精力。1.辅导猪这是一个网站提供各种考试的题目问题与答案,组建强大的题库习题系统。包括小学题库、初中题库、大学题库、驾照题库、职业资格考试题库,涵盖语文、数学、英语、物理、化学、生物......
  • 房地产经纪人题不会怎么搜答案?
    本文将为大家介绍几款备受大学生欢迎的日常搜题和学习软件,帮助你们轻松应对学业挑战,取得更好的学习成果。1.一键抠图一款专业的图片编辑处理APP基本上能满足日常的需求了,不仅支持人像和物品抠图,还有照片修复,智能证件照、图片无损放大,去水印等实用功能,抠图效果很细致,边缘处理也很完......
  • 洛谷二分题单和二分算法
    在题目有出现极值的时候可以运用二分算法,像最小值最大化和最大值最小化又或者像会有中位数,大于这个数的时候可以把他全部视为1小于这个数可以全部视为0,这样隐藏的单调也是可以运用二分。最难的好像就是check函数的设计板子的不同会导致L,R和mid的关系不然会超时,L+1<R的L是=mid,而L......