0
点赞
收藏
分享

微信扫一扫

(每日一练c++)报数游戏

elvinyang 2022-02-16 阅读 84

报数游戏

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

相关推荐

0 条评论