Bomba de láser - Guía avanzada Algoritmo de Competencia

Título Descripción
Hay N de destino en el mapa, con número entero Xi, Yi representa la posición del objetivo en el mapa, y cada uno tiene un valor objetivo Wi.

Nota: Los diferentes objetivos de mayo en el mismo lugar.

Hay una nueva bomba láser, puede destruir todos los objetivos dentro de unas posiciones que contienen R cuadrado R ×.

entrega bomba láser a través de posicionamiento por satélite, pero tiene un inconveniente es su rango explosivo, es decir, el lado del cuadrado debe ser x, eje y.

Buscando una bomba explotó en el mapa hasta un valor total de la cantidad de la diana.

Formato de entrada
primera línea de entrada número entero N y R, representa el número de objetos en el lado de la plaza, y los datos de los mapas separados por espacios.

Siguiente N líneas de un conjunto de datos de entrada, comprendiendo cada conjunto tres datos enteros xi, yi, WI, que representan el objetivo coordenada x, y los valores de coordenadas y los datos separados por espacios.

Formato de salida
de salida de un número entero positivo que representa hasta hacer estallar una bomba en el valor del número total de objetos del mapa.

Rango de datos
0≤R≤10. 9 ^
0 <N≤10000
0≤Xi, Yi≤5000
0≤Wi≤1000

Ejemplo de entrada
2. 1
0 0. 1
. 1. 1. 1

Salida de muestra
1

Código AC

/*
其实这也是一个前缀和的问题
其实这就是一个计算一个区域R的里面和最大的值
只需要遍历所有的R即可,这样的时间复杂度极限下,
遍历所有也不过是5000*5000,也就是两千五百万 
*/


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

using namespace std;

int N, R;
int map[5005][5005];




int main()
{
	memset(map, 0, sizeof(int)*5005*5005);
	
	cin >> N >> R;
	R = min(5001,R);
	int x, y, w;
	int maxX = 0, maxY = 0;
	//千万记住!!! 如果摧毁的范围是R*R,那么此时最大X,Y坐标一定大于等于R 
	//你没有这部,那么在后面步奏,会因为R过大,导致出现错误 
	maxX = R, maxY = R;
	for(int i = 0; i < N; i++)
	{
		scanf("%d %d %d",&x,&y,&w);
		++x,++y;
		//向右下角移一个,方便后面计算前缀和 
		maxX = max(x, maxX);
		maxY = max(y, maxY);
		map[x][y] += w;//千万记住,如果在同一个地方~他们会相加的!!! 
	}
	
	
	for(int i = 1; i <= maxX ; ++i)
	{
		for(int j = 1; j <= maxY && j >= 0; ++j)
		{
			map[i][j] = map[i-1][j] + map[i][j-1] - map[i-1][j-1] + map[i][j];
		}
	}
	
	int count = 0;
	
	for(int i = R; i <= maxX; ++i)
	{
		for(int j = R; j <= maxY; ++j)
		{
			count = max(count, map[i][j]-map[i-R][j]-map[i][j-R]+map[i-R][j-R]);
		} 
	}
	
	cout << count << endl;
	
	return 0;
} 
Publicado 40 artículos originales · alabanza ganado 50 · vistas 4697

Supongo que te gusta

Origin blog.csdn.net/qq_43800455/article/details/105334934
Recomendado
Clasificación