请问各位大佬,这道题目的解题方法?

题目描述
报数游戏

首先,会给他们一人一个编号,并且每个人的编号都不相同。接下来的每一回合,会给一个数,编号超过它的最小编号的人要报出自己的编号。如果没有人的编号比给出的数要大,那么编号最大的人要报出自己的编号。每个人可以重复报号。

会按照一个列表顺次报出每个回合的数,朋友们想知道每回合报出的编号应该是多少。

输入
输入数据共 3 行。

第一行有两个整数 n,m(1≤n≤100,000,1≤m≤100,000),分别表示参与游戏的朋友的个数,和游戏的回合数。 第二行 n个整数 ai(1≤ai≤100,000,000),表示朋友们每个人的编号。对于 0≤i<j<n,都有 ai<aj,即他们的编号递增排列。 第三行 m 个整数 qi(1≤qi≤100,000,000),表示每回合给的数字。

输出
输出共一行 m 个整数,表示每回合报出的编号,每两个整数之间一个空格,最后一个数后面没有空格。

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int ai[100010], qi[100010];
int main()
{
	int a, q;
	while (cin >> a >> q)
	{
		for (int i = 0; i < a; i++)cin >> ai[i];
		for (int i = 0; i < q; i++)cin >> qi[i];
		for (int i = 0; i < q; i++) {
			int left = 0, right = a - 1, mid;
			while (left < right) {
				mid = (left + right) >> 1;
				if (ai[mid] <= qi[i])left = mid + 1;
				else right = mid;
			}
			if (left - 1 < 0 || ai[left] < qi[i])left++;//qi[i]小于最小值或大于最大值的情况
			i ? cout << " " << ai[left - 1] : cout << ai[left - 1];			
		}
		cout << endl;
	}
	return 0;
}

 

这道题应该是二分查找,找到比给定数大的最小的编号,如果没找到就输出最大的那个编号。如果找到了就从找到的编号开始一直输出。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632