二分查找相关的题

问题 A: 找x

http://codeup.cn/problem.php?cid=100000585&pid=0
在这里插入图片描述
在这里插入图片描述

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int solve(int left,int right,int x,int a[])
{
    
    
	int mid;
	while(left<=right)
	{
    
    
		mid=(left+right)/2;
		if(a[mid]==x)
			return mid;
		if(a[mid]>x)
		{
    
    
			right=mid-1;
		}
		else
		{
    
    
			left=mid+1;
		}
	}
	return -1;
}
int main(void)
{
    
    
	int n;
	while(cin>>n)
	{
    
    
		int a[205];
		for(int i=0;i<n;i++)
		{
    
    
			cin>>a[i];
		}
		sort(a,a+n);
		int x;
		cin>>x;
		printf("%d\n",solve(0,n-1,x,a));
	}
	return 0;
}

问题 B: 打印极值点下标

http://codeup.cn/problem.php?cid=100000585&pid=1
在这里插入图片描述
在这里插入图片描述
思路:
先看第一个和第二个相不相等,不相等就输出下标
看中间部分挨个遍历,如果一个数的左边一个数和右边一个数都不这个数大或小,就输出当前的下标。
然后看最后一个和最后第二个相不相等,不相等就输出下标。

#include<iostream>
#include<cstdio>
using namespace std;
int main(void)
{
    
    
	int n;
	int N;
	while( scanf("%d",&n) != EOF)
	{
    
    
		for(int i=0;i<n;i++)
		{
    
    
			cin>>N;
			int a[85]={
    
    0};
			for(int i=0;i<N;i++)
				scanf("%d",&a[i]);
			if(a[0]!=a[1])
				printf("0 ");
			for(int i=1;i<N-1;i++)
			{
    
    
				if( ( a[i]>a[i-1] && a[i]>a[i+1] ) ||  (a[i]<a[i-1] && a[i+1]>a[i] ) )
				{
    
    
					printf("%d ",i);
				}
			}
			if(a[N-1]!=a[N-2])
				printf("%d\n",N-1);
		}
	}
	return 0;
}

问题 C: 查找

http://codeup.cn/problem.php?cid=100000585&pid=2

在这里插入图片描述
在这里插入图片描述

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
bool flag(int a[],int left,int right,int number)
{
    
    
	int mid;
	while(left<=right)
	{
    
    
		mid=(left+right)/2;
		if(a[mid]==number)
			return true;
		if(a[mid]>number)
		{
    
    
			right=mid-1;
		}
		else
		{
    
    
			left=mid+1;
		}
	}
	return false;
}
int main(void)
{
    
    
	int n,m;
	int i;
	int a[105];
	while(cin>>n)
	{
    
    
		for(i=0;i<n;i++)
			cin>>a[i];
		sort(a,a+n);
		cin>>m;
		for(i=0;i<m;i++)
		{
    
    
			int number;
			cin>>number;
			if(flag(a,0,n-1,number))
				printf("YES\n");
			else
				printf("NO\n");
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46527915/article/details/114978292