C++实现输入描述: 第一行两个整数n,k(1≤n≤10 5 ,0≤k≤10 9 )。 第二行n个数,第i个数为a i (−10 9 ≤a i ≤10 9 )。 输出描述: 输出神农最多能尝试的草药数量。 示例1 输入 5 6 2 -3 5 1 6 输出 3 示例2 输入 5 3 2 -3 5 1 6 输出 1
时间: 2023-12-06 11:42:00 浏览: 119
这道题可以使用二分法来解决。首先对草药的价值进行排序,然后二分出一个值 mid,表示神农能够尝试的最大草药价值。接下来遍历整个草药数组,将草药价值大于等于 mid 的草药都加入到一个累加器中,如果累加器中的值超过了 k,则说明神农不能尝试的草药的价值需要小于 mid,此时将二分的上界调整为 mid-1,否则将二分的下界调整为 mid+1。最后得到的就是神农最多能尝试的草药数量。
下面是代码实现:
相关问题
CPP72 找到数组里的第k大数(C++) 题目描述 给出一个包含n个整数的数组a,使用vector存储。用STL算法实现输出数组的第k大数。 输入描述: 第一行两个整数n ,k。(1≤k≤n) 第二行n个整数表示数组a。 输出描述: 输出一个数表示答案。 示例 输入:10 2 22 30 99 98 41 69 3 47 40 97 输出:22 c++代码实现
下面是使用STL算法实现输出数组第k大数的C++代码:
```
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n, k;
cin >> n >> k;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
nth_element(a.begin(), a.begin() + k - 1, a.end(), greater<int>());
cout << a[k - 1] << endl;
return 0;
}
```
使用nth_element函数,将数组部分排序,使得第k大的元素排在数组的第k-1个位置上,最后输出该元素即可。
用c++求解输入描述:第一行是一个整数n(≤10000),接着n行中每一行包括两个整数b和e (1 ≤ b ≤ e ≤ 300000),其中b是活动开始时间,e是活动结束时间。 • 输出描述:输出所有活动占用时间的最大值
好的,这是一个经典的贪心问题,可以使用C++来求解。下面是一个可能的实现,供参考:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Activity {
int begin;
int end;
};
bool cmp(Activity a, Activity b) {
return a.end < b.end;
}
int main() {
int n;
cin >> n;
vector<Activity> activities(n);
for (int i = 0; i < n; i++) {
cin >> activities[i].begin >> activities[i].end;
}
sort(activities.begin(), activities.end(), cmp);
int end_time = 0;
int max_duration = 0;
for (int i = 0; i < n; i++) {
if (activities[i].begin >= end_time) {
int duration = activities[i].end - activities[i].begin;
if (duration > max_duration) {
max_duration = duration;
}
end_time = activities[i].end;
}
}
cout << max_duration << endl;
return 0;
}
```
这段代码的基本思路是,首先按照活动的结束时间从小到大排序,然后依次遍历每个活动,如果当前活动的开始时间晚于等于上一个活动的结束时间,说明它可以被安排在上一个活动之后,此时计算它的持续时间,并更新最大持续时间;如果当前活动的开始时间早于上一个活动的结束时间,说明它与上一个活动有冲突,应该跳过。最后输出最大持续时间即可。
阅读全文