问题 E: 小李打怪兽II

Posted iamcookieandyou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题 E: 小李打怪兽II相关的知识,希望对你有一定的参考价值。

问题 E: 小李打怪兽II

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

在一个弱智游戏里,有m行n列的怪兽,每个怪兽用一个数值表示它的生命值。小李每次的攻击力都为k。
对于小李的每次攻击,给出三个整数x,y,r,表示对于以点(x−r,y−r)为左上角,点(x+r,y+r)为右下角的矩形范围内的怪兽生命值都减去k。怪兽生命值为0时就死了。请计算经过小李g轮的疯狂攻击,还剩几个怪兽存活。

输入

第一行四个整数,分别表示m,n,k,g。
接下来g行整数,每行三个分别表示对应的x,y,r。
接下来是m行n列的正整数ai,j。

输出

一个整数,表示答案。

样例输入 Copy

6 5 2 1
4 3 2
3 2 1 2 5
1 2 4 1 1
3 3 3 1 2
4 43 1 1 5
5 2 2 2 4
1 1 3 1 5

样例输出 Copy

16

提示

对于100%的数据,1≤n,m,x,y,r≤1025,1≤k,a≤100,1≤g≤106
 
 
这题主要是用到了差分算法,简单的差分数组的应用
 
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1050, M = 1e6 + 10;

int m, n, k, g;
int a[N][N], b[N][N];
int d[M][3];
//差分函数
void insert(int x1, int y1, int x2, int y2, int c){
	b[x1][y1] += c;
	b[x1][y2 + 1] -= c;
	b[x2 + 1][y1] -= c;
	b[x2 + 1][y2 + 1] += c;
}
int main(){
	cin >> m >> n >> k >> g;
	
	while (g -- ){
	    int x, y, r;
	    cin >> x >> y >> r;
	    insert(x - r, y - r, x + r, y + r, -k);//攻击,减去攻击范围内怪兽的生命值,k要输入负值
	}
	for (int i = 1; i <= m; i ++ )
		for (int j = 1; j <= n; j ++ )
			cin >> a[i][j], insert(i, j, i, j, a[i][j]);//将怪兽生命值插进去
	
	for (int i = 1; i <= m; i ++ )
		for (int j = 1; j <= n; j ++ )
            a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j];

	int cnt = 0;
	for (int i = 1; i <= m; i ++ ){
	    for (int j = 1; j <= n; j ++ ){
		    if (a[i][j] > 0) cnt ++;//如果怪兽生命值大于零,怪兽活着,要计数
		}
	}
		
	cout << cnt << endl;
	
	return 0; 
}

  

以上是关于问题 E: 小李打怪兽II的主要内容,如果未能解决你的问题,请参考以下文章

[51nod1670] 打怪兽

51 Nod 1670 打怪兽

腾讯机试题 AcWing 603 打怪兽

Objective-C中小怪兽的逻辑

wustacm2021周赛3 打怪兽

alicode43-打怪兽