zl程序教程

您现在的位置是:首页 >  其它

当前栏目

二分查找相关的题

相关 查找 二分
2023-09-11 14:15:52 时间

问题 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;
}