给定一定长度为 n 的单调递增的正整数序列,即序列中的每一个数都比前一个大,有 m 个询问,每次询问一个 x,问序列中最后一个小于等于 x 的数是什么? n<=100000给定一个长度为 n 的单调递增的正整数序列,即序列中的每一个数都比前一个数大,有 m 个询问, 每次询问一个 x。输出共 m 行,表示序列中最后一个小于等于 x 的数都是多少。如果没有输出 - 1。用C语言编程
时间: 2024-01-22 15:19:18 浏览: 110
以下是 C 语言的代码实现:
```c
#include <stdio.h>
int main() {
int n, m, i, j, x, ans;
int a[100000];
scanf("%d%d", &n, &m);
for (i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
for (j = 0; j < m; ++j) {
scanf("%d", &x);
ans = -1;
for (i = 0; i < n; ++i) {
if (a[i] > x) {
break;
}
ans = a[i];
}
printf("%d\n", ans);
}
return 0;
}
```
代码思路如下:
首先输入序列长度 n 和询问次数 m,以及整数序列 a。
之后,对于每次询问,输入一个整数 x,并将答案初始化为 -1。
接着,从前往后遍历整个序列 a,如果当前元素比 x 大,则退出循环;否则,将答案更新为当前元素值。
最后,输出答案即可。
需要注意的是,如果循环结束后答案仍然是 -1,说明整个序列中没有小于等于 x 的数,需要输出 -1。
相关问题
给一个长度为n的单调递增的正整数序列,即序列中每一个数都比前一个数大。有m个询问,每次询问一个x,问序列中最后一个小于等于x的数是什么?
### 回答1:
可以使用二分查找来解决这个问题。
具体步骤如下:
1. 定义左右指针left和right,分别指向序列的起始位置和结束位置。
2. 当left<=right时,执行以下步骤:
a. 计算中间位置mid=(left+right)/2。
b. 如果序列中第mid个数小于等于x,则将left更新为mid+1。
c. 否则,将right更新为mid-1。
3. 当left>right时,返回序列中第right个数。
时间复杂度为O(mlogn)。
### 回答2:
假设给定的单调递增正整数序列为a,长度为n,共有m个询问,每次询问一个数x。
我们可以使用二分查找来解决这个问题。首先,我们定义两个指针left和right,分别指向序列的起始和终止位置。然后,我们进入一个循环,直到找到最后一个小于等于x的数。
在每次循环中,我们计算出中间位置mid = (left + right) // 2,并将序列中的值a[mid]与x进行比较。
如果a[mid] <= x,则说明我们需要继续向右查找,即更新left = mid + 1。
如果a[mid] > x,则说明我们需要向左查找,即更新right = mid - 1。
当left > right时,说明我们已经找到了最后一个小于等于x的数。此时,最后一个小于等于x的数就是a[right]。如果没有找到该数,说明序列中所有数都大于x,则返回-1。
以下是用Python实现的代码:
def find_last_number(a, x):
left = 0
right = len(a) - 1
while left <= right:
mid = (left + right) // 2
if a[mid] <= x:
left = mid + 1
else:
right = mid - 1
if right >= 0:
return a[right]
else:
return -1
对于每个询问的数x,我们可以调用以上函数来得到最后一个小于等于x的数。
希望能对你有所帮助!
给定一个长度为n的单调递增的正整数序列,即序列中的每一个数都比前一个数大,有m个询问,每次询问一个x,问序列中最后一个小于等于x的数是什么?声称代码
好的,以下是 C++ 代码实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
while (m--) {
int x;
cin >> x;
int left = 0, right = n - 1;
int ans = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] <= x) {
ans = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
if (ans != -1) {
cout << nums[ans] << endl;
} else {
cout << "No answer" << endl;
}
}
return 0;
}
```
思路是二分查找,每次判断中间位置的数是否小于等于 x,如果是,则更新答案,并在右半部分查找;否则,在左半部分查找。最终得到的答案就是最后一个小于等于 x 的数。
阅读全文
相关推荐

















