给定一定长度为 n 的单调递增的正整数序列,即序列中的每一个数都比前一个大,有 m 个询问,每次询问一个 x,问序列中最后一个小于等于 x 的数是什么? n<=100000给定一个长度为 n 的单调递增的正整数序列,即序列中的每一个数都比前一个数大,有 m 个询问, 每次询问一个 x。输出共 m 行,表示序列中最后一个小于等于 x 的数都是多少。如果没有输出 - 1。用C语言编程
时间: 2024-01-22 12:19:18 浏览: 107
以下是 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的数是什么?声称代码
好的,以下是 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 的数。
2.求解查找最后一个小于等于指定数的元素问题 给定一个长度为n的单调递增的正整数序列,即序列中的每一个数都比前一个数大,有m个询问,每次询问一个x,问序列中最后一个小于等于x的数是什么? 输入描述:给定一个长度为n的单调递增的正整数序列, 即序列中的每一个数都比前一个数大,有m个询问,每次询问一个x。 输出描述:输出共m行,表示序列中最后一个小于等于x的数是多少。如果没有,输出-1。 样例输入: 5 3 1 2 3 4 6 5 1 3 样例输出: 4 1 3使用c++写出完整代码,要求使用动态规划或者贪心算法、回溯算法、分支限界算法的一种
以下是使用二分查找的代码实现:
```c++
#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, res = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] <= x) {
res = nums[mid];
left = mid + 1;
} else {
right = mid - 1;
}
}
cout << res << endl;
}
return 0;
}
```
其中,我们使用二分查找在单调递增的正整数序列中查找最后一个小于等于x的数。具体实现如下:
首先初始化左右指针left和right,分别指向序列的开头和结尾。然后在循环中,每次计算中间位置mid,如果中间位置的值小于等于x,那么说明最后一个小于等于x的数在mid的右边,因此记录下mid位置的值,并将左指针left移到mid+1位置继续查找;否则最后一个小于等于x的数在mid的左边,将右指针right移到mid-1位置继续查找。
最终,如果找到了最后一个小于等于x的数,那么输出该数;否则输出-1。
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![py](https://img-home.csdnimg.cn/images/20250102104920.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)