牛牛面前有一个由n个整数组成的数组 A1,A2,……,An。牛牛打算对这个数组进行若干次操作。每次操作牛牛可以选择A1,A2,…,An中的任意一个非负整数,记所选数的下标为k。然后牛牛会把 Ak,Ak+1,…,An都减少Ak。牛牛想知道他对这个数组进行恰好m次操作后,数组中所有数的和最少是多少。给出c++代码及解释
时间: 2024-03-22 11:36:52 浏览: 247
这是一道典型的贪心算法题目。我们可以先将数组从小到大排序,然后依次进行操作,每次操作选择当前未被减为 0 的最小值进行减操作。这样可以保证每次操作的减少量最小,从而最终得到的数组和也是最小的。下面是对应的 C++ 代码实现:
```c++
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a.begin(), a.end());
int ans = 0;
for (int i = 0; i < m; i++) {
while (ans < n && a[ans] == 0) {
ans++;
}
a[ans]--;
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i];
}
cout << sum << endl;
return 0;
}
```
首先读入数组大小和操作次数,然后读入数组元素并排序。接下来进行 m 次操作,每次选择当前未被减为 0 的最小值进行减操作,并将其下标加 1。最后计算数组元素和并输出即可。
阅读全文