C++程序:求兄弟俩完成a和b个家务的方法数


假设我们有一个包含n个元素的数组A,以及两个值a和b。阿马尔和比马尔是兄弟俩。他们的父母把他们单独留在家中,并委托他们完成n项家务。每项家务都有其复杂度。第i项家务的复杂度等于A[i]。阿马尔年纪较大,他想要选择复杂度大于某个值x(A[i] > x)的家务,把复杂度小于或等于x(A[i] ≤ x)的家务留给比马尔。阿马尔将完成恰好a项家务,比马尔将完成恰好b项家务(a + b = n)。我们必须找到可以选择的x值的数量,以便阿马尔恰好完成a项家务,比马尔恰好完成b项家务?

问题类别

这个问题属于排序问题。当我们讨论计算机科学中不同的问题解决算法时,排序是一个非常常见的问题。顾名思义,排序表示将一组数据排列成某种形式。一般来说,我们可以按非递减顺序或非递增顺序排列它们。否则,排序也可以以预定义的方式进行。对于基于字符串的问题,有时我们使用字典序排序来按字典顺序排列字母。有很多不同的排序技术,它们有一定的变化,以及它们的时间和空间复杂度。迄今为止,基于比较的排序技术的时间复杂度的下界是O(n*log n)。但是,也有一些机械排序技术,如桶排序、基数排序、计数排序,它们的时间复杂度是线性的O(n)。更多阅读,请点击以下链接:

https://tutorialspoint.com/data_structures_algorithms/sorting_algorithms.htm

因此,如果我们的问题的输入类似于A = [6, 2, 3, 100, 1];a = 2;b = 3,则输出将为3,因为x的可能值为3、4或5。

步骤

为了解决这个问题,我们将遵循以下步骤:

sort the array A
return A[b] - A[b - 1]

示例

让我们来看下面的实现,以便更好地理解:

#include <bits/stdc++.h>
using namespace std;
int solve(vector<int> A, int a, int b){
   sort(A.begin(), A.end());
   return A[b] - A[b - 1];
}
int main(){
   vector<int> A = { 6, 2, 3, 100, 1 };
   int a = 2;
   int b = 3;
   cout << solve(A, a, b) << endl;
}

输入

{ 6, 2, 3, 100, 1 }, 2, 3

输出

3

更新于:2022年4月7日

浏览量:168

开启你的职业生涯

完成课程获得认证

开始学习
广告