【题解】报数游戏
【题目描述】
路飞在和他朋友们一块玩一个游戏。由于路飞的机智,这个游戏由路飞担任裁判。
首先,路飞会给他们一个人一个编号,并且每个人的编号都不相同。接下来的每一个回合,会给一个数,编号不超过它的最大编号
的人要报出自己的编号。如果没有人的编号比路飞给出的数要小,那么编号最小的人要报出自己的编号。每个人可以重复报号。
路飞会按照一个列表顺次报出每个回合的数,他的朋友们想知道每回合报出的编号应该是多少?
【输入描述】
输入数据共3行。
第一行有两个整数n,m( 1<=n<=105 , 1<=m<=105 ),分别表示参与游戏的路飞朋友的个数和游戏回合数。
第二行n个整数 ai (1<=ai<=108) ,表示朋友们每个人的编号。对于 0<=i<j<n, 都有 ai<aj,即他们的编号递增排列。
第三行m个整数 qi(1 <= qi <=108), 表示每回合路飞给的数字。
【输出描述】
输出共一行m个整数,表示每回合报出的编号,每两个整数之间一个空格,最后一个数后面没有空格。
【样例输入】
5 5 1 5 10 15 20 3 6 12 18 24
【样例输出】
1 5 10 15 20
【题目分析】
【参考代码】
#include<iostream> using namespace std; int a[100005]; int ans(int l, int r, int x) { while(l < r) { int mid = l + r+1 >> 1; if(a[mid] <= x) l = mid; else r = mid - 1; } return a[l]; } int main() { int n, m; cin >> n >> m; for(int i = 1; i <= n; i++) { cin >> a[i]; } int t; for(int i = 1; i <= m; i++) { cin >> t; if(i != m) cout << ans(1, n, t) << ' '; else cout << ans(1, n, t); } return 0; }
(adsbygoogle = window.adsbygoogle || []).push({});