在今天做了这道题,有点收获,所以我就在发一个博客,主要是记录一下。
先开始我是找到值过后一个一个减去1的,太麻烦了代码量太大了。没有注意读题
如果我想错了请大佬告诉我,思路就是贪心,至于怎么贪心。看了题目肯定是先操作一个区间的数,然后找到最小值,在进行减1操作,注意这点
你选择的数一定是要大于0的,为0的话我们就跳过,我们只有后面慢慢的一个一个的减去1一直到为0,减去的至少是1的倍数,所以我们可以直接加最小值到我们的输出的答案中。
所以我们可以直接减去最小值,减少我们的代码量。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, K;
cin >> n >> K;
vector<ll> A(n+2);
for (int i = 0; i < n; i++) {
cin >> A[i];
}
ll sum = 0;贪心 肯定是先进行k倍区间的减,然后在进行不是k的减,只能单独减
for (int i = 0; i <= n - K; i++) { 确保i+K不越界
bool flag = false;
for (int j = i; j < i + K; j++) {
if (A[j] == 0) {
flag = true;
break; 找到零即停止检查
}
}
if (!flag) { 如果没有零就可以减
ll min1 = *min_element(A.begin() + i, A.begin() + i + K); 找到最小值
if (min1 > 0) { 确保最小值大于0//不能为负数
for (int j = i; j < i + K; j++) {
A[j] -= min1;
}
sum += min1;
}
}
}
for (int i = 0; i < n; i++) {
if(A[i]>0){
sum += A[i]; 将剩余元素加到sum中
}
}
cout << sum << endl;
return 0;
}
最后我们就把需要单独减的找出来,加到答案中去就解决问题了