首页 > 其他分享 >二分

二分

时间:2024-07-08 16:09:18浏览次数:8  
标签:二分 Mirko 15 int long sf

二分 \(\sf\small\color{gray}Binary\)

思想

要想区分不同,又想种类最少,“二”这个数值可谓是不二人选。
原因很简单。因为 1+1=2
那你是不是就可以取一个中间值,把一串数据分成两部分,然后依据这个中间值判断目标值是在左边还是右边?
二分查找就出来了。

二分查找

就是在一个 \(\sf\color{red}有序\) 的序列中,
每一次都取中间元素,
如果目标元素比中间元素小,就将范围缩小到左边的一半。
如果目标元素比中间元素大,就将范围缩小到右边的一半。

翻来覆去,最终便可以找到目标元素。
这比遍历查找快多了。
主要是利用了序列的 \(\sf\color{red}单调性\) \(\sf\small\color{gray}有序性\)。

查找

输入 \(\sf n\) 个不超过 \(\sf 10^9\) 的单调不减的(就是后面的数字不小于前面的数字)非负整数 \(\sf a_1,a_2,\dots,a_{n}\),然后进行 \(\sf m\) 次询问。对于每次询问,给出一个整数 \(\sf q\),要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 \(\sf -1\) 。

此题为板到不能再板的板子题。
不做解释。

二分函数

由于要找的数一定在数列中,就让它再 \(\sf 1\) 和 \(\sf N\) 之间着了。
找不到再判断。

int Find(int n)
{
	int R=N,L=1,M;
	while(L<R)
	{
		M=(L+R)>>1;
		if(n<=A[M])	R=M;
		else		L=M+1;
	}
	if(A[L]!=n)	return -1;
	return L;
}

完整代码

#include<cstdio>
int N,M,o,A[1000100];
int Find(int n)
{
	int R=N,L=1,M;
	while(L<R)
	{
		M=(L+R)>>1;
		if(n<=A[M])	R=M;
		else		L=M+1;
	}
	if(A[L]!=n)	return -1;
	return L;
}
int main() 
{
	scanf("%d %d",&N,&M);
	for(int i=1;i<=N;i++)
		scanf("%d",&A[i]);
	for(int i=0;i<M;i++)
		scanf("%d",&o),
		printf("%d ",Find(o));
	return 0;
}

二分答案

如果我的答案在一个范围之间,我还去枚举吗?
可以用二分吗?
可以是可以,但你要保证答案序列的单调性。
每一次去算一下答案,与目标比较,然后二分。

[COCI 2011/2012 #5] EKO / 砍树

伐木工人 Mirko 需要砍 \(\sf M\) 米长的木材。对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一般砍伐森林。不过, Mirko 只被允许砍伐一排树。
Mirko 的伐木机工作流程如下: Mirko 设置一个高度参数 \(\sf H\)(米),伐木机升起一个巨大的锯片到高度 \(\sf H\),并锯掉所有树比 \(\sf H\) 高的部分(当然,树木不高于 \(\sf H\) 米的部分保持不变)。Mirko 就得到树木被锯下的部分。例如,如果一排树的高度分别为 \(\sf 20,15,10\) 和 \(\sf 17\),Mirko 把锯片升到 \(15\) 米的高度,切割后树木剩下的高度将是 \(\sf 15,15,10\) 和 \(\sf 15\),而 Mirko 将从第 \(\sf 1\) 棵树得到 \(\sf 5\) 米,从第 \(\sf 4\) 棵树得到 \(\sf 2\) 米,共得到 \(\sf 7\) 米木材。
Mirko 非常关注生态保护,所以他不会砍掉过多的木材。这也是他尽可能高地设定伐木机锯片的原因。请帮助 Mirko 找到伐木机锯片的最大的整数高度 \(\sf H\),使得他能得到的木材至少为 \(\sf M\) 米。换句话说,如果再升高 \(\sf 1\) 米,他将得不到 \(\sf M\) 米木材。

只需要把 if 里的东西换一换……

#include<cstdio>
#include<cmath>
int a[1000010];
int N,m;
unsigned long long cut(const int hight)
{
	long long ans=0;
	for(int i=0;i<N;i++)
			ans+=(a[i]-hight)>0?(a[i]-hight):0;
	return ans;
}
void cuttree(const int maxn)
{
	int L=0,R=maxn,M;
	int LM;
	while(L<=R)
	{
		M=(L+R)>>1;
		unsigned long long cutted=cut(M);
		if(abs(M-LM)<2&&cutted>m)
			break;
		if(cutted>m)
			L=M;
		else if(cutted<m)
			R=M;
		else
			break;
		LM=M;
	}
	printf("%d",M);
}
int main()
{
	scanf("%d%d",&N,&m);
	int maxn=0;
	for(int i=0;i<N;i++)
	{
		scanf("%d",&a[i]);
		maxn=a[i]>maxn?a[i]:maxn;
	}
	cuttree(maxn);
	return 0;
}

结语

二分就是更好的枚举。
记住他的局限:单调性


完结散花

标签:二分,Mirko,15,int,long,sf
From: https://www.cnblogs.com/PCwqyy/p/18290100/Binary

相关文章

  • 【寻迹】二分与三分
    二分与三分二分是一种常用且非常精妙的算法。(英才计划甚至还水了一篇文章)三分法则可以用来解决单峰函数的极值以及相关问题一、二分二分法,在一个单调有序的集合或函数中查找一个解,每次均分为左右两部分,判断解在哪一个部分后调整上下界。每次二分都会舍弃一半区间,因此效率比较高......
  • 二分模板及其原理
    直接上代码#include<bits/stdc++.h>usingnamespacestd;//#defineintlonglong//防止越界//#defintdoublelongdouble//防止越界constintL=0,R=1e9+1;//整数二分边界//constdoubleL=0,R=1e9+1;//实数二分边界constdoubleEPS=1;......
  • 二分图匹配
    是么时二分图这个图的节点可以被分为两个集合,使得同一集合内没有连边。匈牙利算法例题IOI有$m$道题,HPY会$n$个算法,一共有$k$个算法可以解决IOI题。HPY会的算法太多了,所有这次IOI用了这个算法,等到下一次IOI时才会记其这个算法。<h1id="constraint......
  • 二分图匹配——从入门到入土
    基础知识形式化定义:二分图:\(G=(L,R,E)\),满足\(\forall(u,v)\inE\)都有\(u\inL,v\inR\)或\(u\inR,v\inL\)。可知“图中没有长度为奇数的环”是这个图是二分图的充分必要条件。图的匹配是一个\(E_m\subseteqE\)满足\(\nexistsi\inV(\text{当}G......
  • Day1| 704. 二分查找 &27. 移除元素
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/description/思路:切记二分查找要基于排序好的数组或者数据,否则二分查找必不能使用!!!!!!!!!双指针写最简单,一个头指针从0开始,一个尾指针从数组长度-1开始,中间指针是头+尾/2,每次比较头尾中间指针的值......
  • 代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素
    704.二分查找这个之前有写过,最重要的就是把握住要去搜索的区间的形式,包括左闭右闭以及左闭右开两种classSolution{publicintsearch(int[]nums,inttarget){intleft=0,right=nums.length;while(left<right){//左闭右开的版本,结果存储......
  • 逻辑回归求解二分类问题以及SPSS的实现
    分类问题就是给出物质的属性,判断其属于什么成分,本文将讲述逻辑回归求解二分类问题本文着重于模型的实现,对于推导只是概括性的叙述目录一、问题提出二、逻辑回归函数logistic1.线性线性概率模型2.sigmod函数3.求解方法————极大似然估计4.分类原则三、SPSS实现————以水果......
  • qoj5371 Matrix (二分图匹配)
    qoj5371Matrix二分图匹配判断无解的情况,当且仅当有\(a_{i,j}\)为负数或每一行和每一列的和不相同时无解。因为\(m\leN^2\),所以我们只需要每一次至少完成一个\(a_{i,j}\)即可。观察\(B\)矩阵的形成,实际上就是一个\(i\)行只能和一个\(j\)列匹配,跑二分图匹配即可。每......
  • 【秋招刷题打卡】Day02-二分系列之-二分查找
    Day02-二分系列之-二分查找前言给大家推荐一下咱们的陪伴打卡小屋知识星球啦,详细介绍=>笔试刷题陪伴小屋-打卡赢价值丰厚奖励<=⏰小屋将在每日上午发放打卡题目,包括:一道该算法的模版题(主要以力扣,牛客,acwing等其他OJ网站的题目作为模版)一道该算法的应用题(主要以往......
  • 二分查找
    二分查找算法思想有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于......