报数游戏
题目描述
报数游戏 首先,会给他们一人一个编号,并且每个人的编号都不相同。接下来的每一回合,会给一个数,编号超过它的最小编号的人要报出自己的编号。如果没有人的编号比给出的数要大,那么编号最大的人要报出自己的编号。每个人可以重复报号。 会按照一个列表顺次报出每个回合的数,朋友们想知道每回合报出的编号应该是多少。 输入
输入数据共 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++;
i ? cout << " " << ai[left - 1] : cout << ai[left - 1];
}
cout << endl;
}
return 0;
}