当前位置:首页 > 趣味小程序 > 正文内容

【二分与分治】中间值、边界值、循环条件、模块写法(1)

亿万年的星光4年前 (2021-02-27)趣味小程序1776
0.前言

二分法并不简单,或者说“思路简单,细节爆炸”,举例来说,你可能已经看过很多题解,那么可能会看到下面几种写法

mid=(left+right)/2

mid=(left+right)>>1

mid=left+(left+right)/2

mid=left+((left+right)>>1) 

mid = (left+right)/2 +1

mid = (left+right+1)/2

//结束条件写法
while(left<right)

while(left<=right)

while(left+1<left)
//边界值的取法
...
if( )
   left=mid;
else
   right=mid;
...

...
if( )
   left=mid+1;
else
   right=mid;
...

...
if( )
   left=mid+1;
else
   right=mid-1;
...

...
if( )
   left=mid;
else
   right=mid-1;
...

第一次看完之后,我的心情:

此图像的alt属性为空;文件名为u=2964274455,2857956259&fm=26&gp=0.jpg

本来以为很简单,仔细搜索一下,简直要爆炸了,在网上和书上找了很多资料,终于整理出来了。

实际上,二分搜索的题型可以简单归结成几类吧


第一类:二分查找,寻找中间值

第二类:左端点值

第三类:右端点值


1.中间值选取问题

在二分法求解过程中,我们经常使用


mid=(left+right)/2

但是很多地方也有这样的写法

mid=left+(left+right)/2

mid=left+((left+right)>>1)    //使用右移最好加括号,



问题1:负数问题






#include<cstdio>
int main() {

	int left,right,mid1,mid2,mid3,mid4;

	scanf("%d%d",&left,&right);

	mid1 = (left+right)/2;

	mid2 = (left+right)>>1;

	mid3 = left+(right-left)/2;

	mid4 = left+((right-left)>>1);
	
	printf("%d,%d,%d,%d",mid1,mid2,mid3,mid4);

	return 0;   
}



//输入是 99 100  输出结果是99,99,99,99

//输入是 100 99  输出结果是99,99,100,99

//输入是 -99 -100 输出结果是-99,-100,-99,-100

//输入是 -100 -99 输出结果是-99,-100,-100,-100

int类型的取整是向0取整,即使被取整的数绝对值变小
而右移是向下取整,即使被取整的数值变小
所以对于正数时两者相同,而到了负数则变大

问题2:溢出问题

#include<cstdio>
int main() {

	int left,right,mid1,mid2,mid3,mid4;

	scanf("%d%d",&left,&right);

	mid1 = (left+right)/2;

	mid2 = (left+right)>>1;

	mid3 = left+(right-left)/2;

	mid4 = left+((right-left)>>1);
	
	printf("%d,%d,%d,%d",mid1,mid2,mid3,mid4);

	return 0;   
}



//输入是 1999999998 1999999998

// 输出结果分别是

// -147483650

// -147483650

// 1999999998

// 1999999998

问题3:起点问题

对于不同的数组,有的可能是从i=0 开始读入,有的可能是从i=1 开始读入


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

C++小游戏—简单飞机大战(1)

C++小游戏—简单飞机大战(1)

前面文章简单实现了弹球操作,这篇文章我们介绍一下如何实现简单的飞机大战操作。这篇文章我们要实现的效果如下:第一步:整体思路在某个点画出飞机的形状获取用户按下哪个按键根据按键移动飞机的位置按空格键发射子...

C++小游戏——flappy bird简单实现

C++小游戏——flappy bird简单实现

上一篇小游戏中,我们简单实现了打砖块小游戏。这一篇中,我们根据前面的框架,简单实现flappy bird小游戏。1.游戏框架   2.实现下落的小鸟#include &l...

C++小游戏—猜数游戏

0.游戏内容玩家猜电脑产生的数字,一个两次机会,才对了给提示,猜错减去一次机会。1.参考代码#include<iostream>#include<cstdlib>#includ...

【C++图形化编程】EasyX实现弹跳小球

【C++图形化编程】EasyX实现弹跳小球

前面的文章实现了C++控制台显示一个弹跳的小球,这篇文章使用EasyX实现一个带有界面的弹跳小球的效果。首位,我们需要准备好EasyX。然后让EasyX画一个小的圆。然后我们使用前面学过的判断边界的函...

C++小游戏—贪吃蛇(1)

0.前言c++小游戏来到了第二个,第二个小游戏是贪吃蛇。首先来分析一下需求。我们需要一个函数专门来绘制地图的。在地图上随机生成“食物”。按键函数,用来监听键盘事件。蛇的状态函数。移动函数等。1.参考代...

C++小游戏—反弹球实现打砖块

C++小游戏—反弹球实现打砖块

0.前言在上一篇中,我们用C++代码实现了弹球小游戏,上一篇链接可以点击这里查看。这一篇中,我们继续优化代码,使用上一篇的弹球小游戏进行扩展,实现打砖块效果。1.思路底部挡板跟随键盘移动在顶部生成目标...