列表

详情


NC213877. CCA的矩阵

描述

很久很久以后的某一天,老鼠泛滥成灾啦!
有某一个 n×n 的矩形内布满了老鼠,具体来说,(i,j) 上有 w(i,j)只老鼠。
万幸的是,你有一个 k×k 的锤子,一锤子砸下去可以把它覆盖到的所有老鼠清除。
遗憾的是,这个锤子只能斜着锤,形象地说,对于一个 3×3 的锤子,它能覆盖到的区域如下:
- - * - -
- * * * -
* * * * *
- * * * -
- - * - -
你想知道,自己一锤子砸下去,最多能清除多少只老鼠。

输入描述

第一行两个数 n和k 。
之后的 n 行,每行 n 个数,第 i 行 第 j 个数表示在矩形的这个位置有多少只老鼠。

输出描述

一行,一个整数表示最多能清除的老鼠数量。

示例1

输入:

3 2
0 1 1
1 0 1
0 1 0

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 733ms, 内存消耗: 237176K, 提交时间: 2022-10-20 16:01:16

#include<iostream>
using namespace std;

#define int long long
const int N=5021;

int n,k;
int a[N][N],b[N][N],ans;

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    cin>>n>>k;
    for(int i=1;i<=n;i++) 
     for(int j=1;j<=n;j++)
      cin>>a[i][j],b[i+n-j][j+i-1]=a[i][j];
    n=n*2+1;
    k=2*k-1;
    for(int i=1;i<N;i++)
     for(int j=1;j<N;j++)
      b[i][j]+=b[i][j-1]+b[i-1][j]-b[i-1][j-1];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) 
        {
            if((i+j-(n-1)/2)%2==0) continue;
            int x=i+k-1,y=j+k-1;
            ans=max(ans,b[x][y]-b[x][j-1]-b[i-1][y]+b[i-1][j-1]);
        }
    }
    cout<<ans;
    return 0;
}

C++(clang++11) 解法, 执行用时: 480ms, 内存消耗: 136628K, 提交时间: 2021-02-24 22:42:52

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
ll a[4100][4100];
int n,k;
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%lld",&a[i+n-j][i+j]);
		}
	}
	for(int i=1;i<=2*n;i++){
		for(int j=1;j<=2*n;j++){
			a[i][j]+=(a[i-1][j]+a[i][j-1]-a[i-1][j-1]);
		}
	}
	k=2*k-1;
	ll cnt=0;
	for(int i=k;i<=2*n;i++){
		for(int j=k;j<=2*n;j++){
			if(i%2==(j+n)%2) cnt=max(cnt,a[i][j]-a[i-k][j]-a[i][j-k]+a[i-k][j-k]);
		}
	}
	printf("%lld",cnt);
	return 0;
}

上一题