top1编程
← 返回题目
题解

砖块

2 条题解

  • 0
    @ 2026-7-29 0:06:29
    #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
      @ 2026-7-28 22:44:55
      #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