青少年编程知识记录 codecoming

【题解】报数游戏

【题目描述】

路飞在和他朋友们一块玩一个游戏。由于路飞的机智,这个游戏由路飞担任裁判。

首先,路飞会给他们一个人一个编号,并且每个人的编号都不相同。接下来的每一个回合,会给一个数,编号不超过它的最大编号

的人要报出自己的编号。如果没有人的编号比路飞给出的数要小,那么编号最小的人要报出自己的编号。每个人可以重复报号。

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

【输入描述】

输入数据共3行。

第一行有两个整数n,m( 1<=n<=10, 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({});

作者:亿万年的星光 分类:题解目录 浏览: