题解
砖块
2 条题解
-
0
#include <bits/stdc++.h> using namespace std; int n, k, ans = INT_MAX; int a[50005]; int main() { cin >> n >> k; for (int i = 1; i <= n; i++){ cin >> a[i]; } // 滑动窗口,枚举所有可能的连续k个柱子 for (int i = 1, j = k; j <= n; i++, j++) { int t = INT_MAX; // 当前区间的最小值 // 找到区间内最矮的柱子 for (int l = i; l <= j; l++){ t = min(t, a[l]); } int sum = 0; // 计算需要拆除的砖块总数 for (int l = i; l <= j; l++){ sum += a[l] - t; } // 更新全局最小值 ans = min(ans, sum); } cout << ans; return 0; } -
0
#include <bits/stdc++.h> using namespace std; int n, k, minn= INT_MAX,minn2=INT_MAX; int a[50005],b[50005]; int main(){ cin>>n>>k; for(int i=1; i<=n; i++){ cin>>a[i]; b[i]=b[i-1]+a[i];//前缀和 } for(int i=1;i<=n-k+1;i++){//有可能的区间起始位置 minn=INT_MAX; for(int j=i;j<=i+k-1;j++){//找k范围内的最小值 minn=min(minn,a[j]); } //k范围的总和-k倍的最小值,求多出来的砖块 minn2=min((b[i+k-1]-b[i-1])-k*minn,minn2); } cout<<minn2; return 0; }
- 1