Laser Bomb - Guide de l'algorithme avancé de la concurrence

Titre Description
Il y a cible N sur la carte, avec entier Xi, Yi représente la position de la cible sur la carte, et chacun a une valeur cible Wi.

Note: Des objectifs différents peuvent au même endroit.

Il y a une nouvelle bombe laser, peut détruire toutes les cibles dans un contenant carré R × positions R.

Laser livraison à la bombe par positionnement par satellite, mais il a un inconvénient est sa gamme explosive, qui est, du côté de la place doit être x, y axe.

A la recherche d'une bombe a explosé sur la carte jusqu'à une valeur totale de la quantité de la cible.

Format d' entrée
première ligne d'entrée entier N et R, représente le nombre d'objets situés sur le côté du carré, et les données cartographiques séparés par des espaces.

Suivant N lignes d'un ensemble de données d'entrée, chaque ensemble comprenant trois données d'entiers xi, yi, WI, représentant la cible de coordonnées x, y des valeurs de coordonnées et les données séparées par des espaces.

Format de sortie
en sortie un entier positif qui représente jusqu'à faire exploser une bombe sur la valeur du nombre total d'objets cartographiques.

Plage de données
0≤R≤10. 9 ^
0 <N≤10000
0≤Xi, Yi≤5000
0≤Wi≤1000

Échantillon d'entrée
2. 1
0 0. 1
. 1. 1. 1

Sortie échantillon
1

AC code

/*
其实这也是一个前缀和的问题
其实这就是一个计算一个区域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;
} 
Publié 40 articles originaux · louange gagné 50 · vues 4697

Je suppose que tu aimes

Origine blog.csdn.net/qq_43800455/article/details/105334934
conseillé
Classement