小核桃给大家出了一道题:一共有n个从小到大排列的数字,同时小核桃写出一个数字x,接下来有m轮问答,每一轮小核桃写出一个数字t,大家需要回答出这n个数中最后一个小于等于x-t的数的位置。请编写一个程序解决小核桃的问题。 【提示】 可以使用upper_bound函数来找到数组中第一个大于某个值的数的下标pos,pos-1就是数组中最后一个小于等于某个值的数的下标。比如在1 2 2 2 6中找到最后一个小于等于3的数的位置,可以用upper_bound函数先找到第一个大于3的数的位置5,那么4就是最后一个小于等于3的数的位置。 【输入】 共m+2行。 第一行为两个整数n,m,x。 第二行为n个整数,依次表示n个从小到大排列的数字。 接下来m行,每行一个整数t 【输出】 m行,每一行表示这个序列中最后一个小于等于当前x-t的数的位置。如果不存在小于x-t的数则输出0。 【样例输入】 5 5 6 1 3 3 5 5 2 6 5 3 4 【样例输出】 3 0 1 3 1 【数据范围】 1 <= m,n <=100000 1 <= t <= x <= 100000 编辑区 c++
时间: 2024-04-18 13:26:22 浏览: 222
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace;
int main() {
int n, m, x;
cin >> n >> m >> x;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
for (int i = 0; i < m; i++) {
int t;
cin >> t;
auto it = upper_bound(nums.begin(), nums.end(), x - t);
int pos = it - nums.begin() - 1;
if (pos >= 0) {
cout << pos + 1 << endl;
} else {
cout << 0 << endl;
}
}
return 0;
}
```
这是一个 C++ 的实现程序,它会读取输入并解决小核桃的问题。它使用了 `upper_bound` 函数来找到第一个大于某个值的数的位置,然后通过计算得到最后一个小于等于某个值的数的位置。最后,它将结果打印出来。注意,这个程序假设输入是合法的,并且没有对输入进行错误处理。
阅读全文