瞌睡小源


私信TA

用户名:H2130823055

访问量:5051

签 名:

我が名はめぐみん、爆裂魔法を操りし者

等  级
排  名 45
经  验 11547
参赛次数 5
文章发表 76
年  龄 0
在职情况 学生
学  校 贺州学院
专  业

  自我简介:

解题思路:可以用二分法查找解题,因为二分法查到最后刚好就是要替换的数,直接取他的下标就好

注意事项:最高的话,要单独拿出来解

参考代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long int n,m,mark,j;
	long long int x[200000];
	cin>>n>>m;
	for(int i=0,flag=1;i<n;i++)
	{
		cin>>x[i];
		if(flag&&x[i-1]>x[i])//找到队列最高的人
		{
			mark=i-1;
			flag--;
		}
	}
	int expect;
	cin>>expect;
	if(m>x[mark])//新同学最高的情况
	{
		cout<<mark+2<<endl;
		return 0;
	}
	int high,low,mid;
	if(expect==1)//左边
	{
		high=mark;
		low=0;
		while(low<=high)//左边是从小到大排列
		{
			mid=(low+high)>>1;//二进制一退位,相当于除以二
			if(x[mid]<=m)
			{
				low=mid+1;
			}
			else
			{
				high=mid-1;
			}
		}
	}
	else if(expect==2)//右边
	{
		low=mark;high=n-1;
		while(low<=high)//右边是从大到小排列
		{
			mid=(low+high)>>1;
			if(x[mid]>=m)
			{
				low=mid+1;
			}
			else
			{
				high=mid-1;
			}
		}
	}
	cout<<low+1<<endl;//因为数组下标是从0开始,所以加一
	return 0;
}


 

0.0分

1 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区