天崩地裂【R】(擂台赛题目)

命题人:四毛拽根
知识点:二维前缀和
难度:中等
时间限制:1000ms
内存限制:65536KiB

天崩地裂【R】

Description

“银龙重铸之日,骑士归来之时!我们是冠军!”

11月7日凌晨,中国战队EDG3:2战胜韩国战队DK夺得2021英雄联盟全球总决赛冠军。EDG终于不负众望,时隔多年梦不减,用实力证明了自己,也圆了老粉的一个梦。

在决赛的第一轮中,EDG打野jiejie的皇子敢于冲锋,有勇有谋,表现可谓完美。
在这里插入图片描述

皇子的大招叫做天崩地裂,会在目标周围形成环形障碍,是开团的好技能。
被热情感染的小z也想玩皇子,但是小z是新手召唤师,不懂得在哪里释放皇子的大招比较好。所以找到了会编程的你。
为了简化问题,我们假设皇子的大招是一个范围为 10 ∗ 10 10 * 10 1010的方形。现在给出一块 n ∗ m n * m nm 的地图,地图上面有敌方小兵,也有敌方英雄。若小兵被大招命中可以获得1分,若敌方英雄被命中可以获得3分(在方形范围内就算命中,边界也算。注意在本题中敌方英雄不仅仅有5个,并且技能的范围不能越出地图)。现在请你告诉小z可获得的最高分数,和在哪个位置释放技能可以得到最高的分数。如果有多个最高分数的位置,请输出最靠左上的位置。其中,我们用方形的右下角所在的行和列表示技能的位置。
(最靠左上的位置:先将符合的每个位置所在的行号从小到大排序,若有相同的行,再按所在的列号从小到大排序,答案就是排序完的第一个位置)

Input

首先输入两个正整数 n n n , m m m 10 ≤ n ≤ 3000 10 \leq n \leq 3000 10n3000 10 ≤ m ≤ 3000 10 \leq m \leq 3000 10m3000 ),表示地图的大小。
接下来输出 n n n 行, m m m 列的字符矩阵。
(‘ . ’表示空地,‘ * ’表示敌方小兵的位置,‘ # ’表示敌方英雄的位置)

Output

如果该地图中没有小兵和英雄,就输出“gg”。
否则,在第一行输出可获得的最大分数。
在第二行输出两个用空格隔开的整数 x x x , y y y 1 ≤ x ≤ n 1 \leq x \leq n 1xn 1 ≤ y ≤ m 1 \leq y \leq m 1ym )来表示释放技能的位置。

Sample
Input 1
15 15
....##.........
...........#...
...............
...............
...............
..............*
....#.....*....
...............
...............
..........#....
.........*.....
..........*....
.*.............
.........*.#...
...............

Output 1
16
10 12
Input 2
18 19
#.##**.#...........
#.*....*....*#..#.#
*..**#..**.#...#*.#
*....*...#*...#....
**#*##.....*##.*.**
.#.*.#*#...*...#..#
.*.........#.....#.
.......**.##*.*....
**.....##.**......#
...*#*#.#*#**.*..**
**....*##....##.**#
*###...***.#**.**..
*.#*#...*.*#..*..*.
..#..*....*#.#..*..
.#...#....*#.*.#.*.
...*.....##.#.#*...
##....**#*#..##..#*
.....*..##....**..*

Output 2
102
17 15
Hint

code

#include <bits/stdc++.h>
using namespace std;
const int N = 3010;
int n, m;
int s[N][N];
int main() {
    // freopen("data1.in", "r", stdin);
    // freopen("data1.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        getchar();
        for (int j = 1; j <= m; j++) {
            char op;
            scanf("%c", &op);
            if (op == '*')
                s[i][j] = 1;
            else if (op == '#')
                s[i][j] = 3;
            s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
        }
    }
    int res_x = 0, res_y = 0, res = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            int x = i - 10, y = j - 10;
            if (x < 0 || y < 0) continue;
            int temp = s[i][j] - s[i][y] - s[x][j] + s[x][y];
            if (res < temp) {
                res = temp;
                res_x = i, res_y = j;
            }
        }
    }
    if (res == 0)
        puts("gg");
    else {
        printf("%d\n", res);
        printf("%d %d\n", res_x, res_y);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值