全国高校计算机能力挑战赛c++初赛

12月要参加全国计算机能力挑战赛,所以去网上搜了题目做了一下,大致都是一些常规思路,有大佬有更好的方法还望指点一番。

题目
智能除草
农业植保无人机作为最新的设备,可以加注除草剂进行除草。每次工作可以喷洒边长为K的正方形区域。现有一块边长为N的正方形农田,将其分成N*N个方格单元,已知每个单元里的杂草数量。求该植保无人机一次工作最多可以除草的数量。

输入说明:
第一行是2个正整数,分别为N和K(1≤K≤N≤1000)。
之后N行N列正整数,表示每个单元中的杂草数量(不超过50)。
输出说明:
该植保无人机一次工作最多可以除草的数量。

输入样例:
5 2
2 2 1 1 1
1 2 1 5 6
6 1 1 4 5
2 6 1 1 1
1 1 1 1 1
输出样例:
20

按照最后一次提交的代码为评分标准。
思路:

这题是要求最大子矩阵的和,首先求各个点到(0,0)的矩阵面积,即为是s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i,j],再求k*k内的杂草数量,即为w[i][j]=s[i][j]-s[i-k][j]-s[i][j-k]+s[i-k][j-k],w[i][j]的最大值就是答案。

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
const int N=1010;
int k;
int a[N][N],s[N][N],w[N][N];
int n;

int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		} 
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
		}
	}
	int res=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			w[i][j]=s[i][j]-s[i-k][j]-s[i][j-k]+s[i-k][j-k];
			res=max(w[i][j],res);
		}
	}
	cout<<res;
	return 0;
}

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值