📅  最后修改于: 2023-12-03 15:22:18.162000             🧑  作者: Mango
在很多情况下,我们需要找到一个数组的所有子数组的最小值。这时,我们可以使用C++ STL中的set来解决这个问题。
set是一个自动排序的容器,其中的元素按照升序排列。我们可以使用它来存储数组的子数组,并在遍历时比较每个子数组的最小值。
以下是set的基本用法:
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
s.insert(3);
s.insert(1);
s.insert(4);
for (auto i : s) {
cout << i << " ";
}
return 0;
}
输出:
1 3 4
如果我们要找到一个数组的所有子数组的最小值,我们可以使用set的lower_bound函数,在每个子数组中找到最小值,并将其添加到set中。在遍历set时,我们可以找到所有子数组的最小值。
以下是解决这个问题的完整代码:
#include <iostream>
#include <set>
using namespace std;
const int MAXN = 1e5 + 5;
int a[MAXN];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
set<int> s;
long long ans = 0;
for (int i = 0; i < n; i++) {
s.clear();
for (int j = i; j < n; j++) {
s.insert(a[j]);
auto it = s.begin();
ans += *it;
}
}
cout << ans;
return 0;
}
在上面的代码中,我们首先输入了数组a的长度n和所有元素。在内层循环中,我们首先将每个子数组的元素插入set中,然后使用s.begin()找到其最小值,并将其加到答案ans中。
最后,我们输出答案ans即为所有子数组中最小值的和。
set是C++ STL中非常有用的一个容器,可以用于自动排序和查找元素的功能。在本例中,我们使用set找到一个数组的所有子数组的最小值,并将其加到答案中。这是一种非常高效的解决方案,可以在较短的时间内求出答案。