欢迎光临散文网 会员登陆 & 注册

算法竞赛2022年第十三届蓝桥杯C++ B组_统计子矩阵

2022-04-16 15:58 作者:Clayton_Zhou  | 我要投稿

// https://www.acwing.com/problem/content/submission/4408/

// 代码已经检测通过

#include<iostream>  

#include<algorithm>

 using namespace std;


typedef long long ll;

const int N = 503;

int n=3, m=4, k=10;

int a[N][N]={

{0,0, 0, 0, 0},

{0,1, 2, 3, 4},

{0,5, 6, 7, 8},

{0,9, 10, 11, 12}

};



int main(){

 

   // cin >> n >> m >> k;

    for(int i=1; i<=n; i++){

        for(int j=1; j<=m; j++){

           // cin >> a[i][j];

            a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];

        }

    }



for(int i=1; i<=n; i++){

        for(int j=1; j<=m; j++){

            cout <<  a[i][j]<<"   ";            

        }

cout << endl;

    }

    ll ans = 0;

    for(int i=1; i<=m; i++){

        for(int j=i; j<=m; j++){

            for(int s = 1, t = 1; t <= n; t ++ ){

// a[t][j] - a[s - 1][j]    --> j 列  t-(s-1)行

// a[t][i - 1] - a[s - 1][i - 1]    i-1 列  t-(s-1)行

//  j-(i-1) 列  t-(s-1)行,        左上角(s,i),  右下角 (t,j) 确定矩阵的元素之和

                while(s <= t && a[t][j] - a[s - 1][j] - a[t][i - 1] + a[s - 1][i - 1] > k) s ++ ;

                if(s <= t) ans += t - s + 1; // 最大行为t行(包含i列到j列)的矩阵个数

            }

        }

    }


    cout << ans << '\n';

}

 


算法竞赛2022年第十三届蓝桥杯C++ B组_统计子矩阵的评论 (共 条)

分享到微博请遵守国家法律