我是靠谱客的博主 传统火龙果,最近开发中收集的这篇文章主要介绍秋季学期一起开心讲课-week02-二分,贪心,尺取,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

二分:

①左闭右开二分

//左闭右开 二分 
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 9
int main()
{
	int a[maxn];
	for(int i = 0; i < maxn; i ++)
		scanf("%d",&a[i]);
	sort(a,a+maxn);
	int left = 0;
	int right = maxn;
	int mid;
	int target;
	int flag = 0;
	scanf("%d",&target);
	while(left<right)
	{
		mid = (left+right)/2;
		if(a[mid]<target)
			left = mid + 1;
		else if(a[mid]>target)
			right = mid;
		else 
		{
			flag = 1;
			break;
		}
	 } 
	 if(flag)
		 printf("%d",mid);
	else
		printf("-1");
} 

②左闭右闭二分

//左闭右闭 二分 
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 9
int main()
{
	int a[maxn];
	for(int i = 0; i < maxn; i ++)
		scanf("%d",&a[i]);
	sort(a,a+maxn);
	int left = 0;
	int right = maxn - 1;
	int mid;
	int target;
	int flag = 0;
	scanf("%d",&target);
	while(left<=right)//不同的地方 
	{
		//防止溢出 mid = (left)+(right-left)/2; 
		mid = (left+right)/2;
		if(a[mid]<target)
			left = mid + 1;
		else if(a[mid]>target)
			right = mid -1;
		else 
		{
			flag = 1;
			break;
		}
	 } 
	 if(flag)
		 printf("%d",mid);
	else
		printf("-1");
} 

尺取:

两个指针,初始状态左指针在最左端,右指针在下一个位置。

首先右指针移动,移动到符合条件的时刻后;

接下来左指针开始移动,移动到刚好不符合目标状态,重复步骤1.

int l,r;        //左右指针
int len;        //数组长度
l = r = 1;      //初始指针
while(l<len){
    // ok() 状态满足要求
    while( r<len && !ok() )
    {
        change();   // change() r右移的状态改变
        r++;
    }
    
    if( !ok() ) break;      // r到最右还不满足要求,算法结束
 
    ans += x;   // 答案处理
    change();   // l右移的状态改变
    l++;
}

 

最后

以上就是传统火龙果为你收集整理的秋季学期一起开心讲课-week02-二分,贪心,尺取的全部内容,希望文章能够帮你解决秋季学期一起开心讲课-week02-二分,贪心,尺取所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部