【每日一题(21)】轰炸区最优选取 2017年哈尔滨理工大学新生赛低年级组

来源:互联网 发布:珠海软件怎么样 编辑:程序博客网 时间:2024/04/30 06:17

轰炸区最优选取 2017年哈尔滨理工大学新生赛低年级组 - D

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

现在给出一个正方形地图,其边长为n,地图上有的地方是空的,有的地方会有敌人。
我们现在有一次轰炸敌人的机会,轰炸敌人的区域是一个k*k的正方形区域,现在需要你解决的问题就是计算最多轰炸的敌人数量是多少。

输入描述

本题包含多组数据,每组数据第一行输入两个数n,k。
接下来n行,每行n个数字,表示这个点上的敌人数量。
数据范围:
1<=n<=50
1<=k<=n
每个点上的敌人数量不超过100个(0<=a[i][j]<=100)。
输出描述:
每组数据输出包含一行,表示计算的结果。

输入

4 2
1 1 0 0
1 1 0 0
0 0 2 2
0 0 2 2

输出

8

说明

样例中,显然轰炸右下角那个部分能够击败最多的敌人

题意

这显然是一道搜索题,不知道有没有更好的算法

题解

#include<iostream>#include<cstdio>using namespace std;int cnt(int x,int y);int a[55][55];int n,k;int main(){  while(cin>>n>>k){    for(int i = 0;i < n; i++)      for(int j = 0;j < n; j++)        cin >> a[i][j];    int max = -1;    for(int i = k - 1;i < n; i++){      for(int j = k - 1;j < n; j++){        int x = cnt(i,j);        max = max > x ? max : x;      }    }    cout << max << endl;  }  return 0;}int cnt(int x,int y){  int cnt = 0;  for(int i = x;i >= x- k + 1; i--)    for(int j = y;j >= y - k + 1; j--)      cnt += a[i][j];  return cnt;}
阅读全文
0 0
原创粉丝点击