NOIP2014D2T1-無線網路發射器選址
阿新 • • 發佈:2019-02-06
問題描述
隨著智慧手機的日益普及,人們對無線網的需求日益增大。某城市決定對城市內的公共場所覆蓋無線網。
假設該城市的佈局為由嚴格平行的 129 條東西向街道和 129 條南北向街道所形成的網格狀,並且相鄰的平行街道之間的距離都是恆定值 11 。東西向街道從北到南依次編號為 0,1,2 …128,南北向街道從西到東依次編號為 0,1,2…128 。
東西向街道和南北向街道相交形成路口,規定編號為 xx 的南北向街道和編號為 y 的東西向街道形成的路口的座標是(x,y) 。在某些路口存在一定數量的公共場所。
由於政府財政問題,只能安裝一個大型無線網路發射器。該無線網路發射器的傳播範圍是一個以該點為中心,邊長為 2d 的正方形。傳播範圍包括正方形邊界。
現在政府有關部門準備安裝一個傳播引數為 dd 的無線網路發射器,希望你幫助他們在城市內找出合適的路口作為安裝地點,使得覆蓋的公共場所最多。
輸入格式
第一行包含一個整數 d ,表示無線網路發射器的傳播距離。
第二行包含一個整數 n ,表示有公共場所的路口數目。
接下來 n 行,每行給出三個整數x,y,k ,中間用一個空格隔開,分別代表路口的座標(x,y) 以及該路口公共場所的數量。同一座標只會給出一次。
輸出格式
輸出一行,包含兩個整數,用一個空格隔開,分別表示能覆蓋最多公共場所的安裝地點方案數,以及能覆蓋的最多公共場所的數量。
樣例輸入
1
2
4 4 10
6 6 20
樣例輸出
1 30
思路分析
暴力列舉
AC程式碼
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int mp[150][150];
int ans[150][150];
int d,n;
int main(){
cin>>d>>n;
for(int i=0;i<150;i++){
for(int j=0;j<n;j++)mp[i][j]=ans[i][j]=0;
}
for(int i=0;i<n;i++){
int x,y,k;
cin>>x>>y>>k;
mp[x][y]=k;
}
for (int i=0;i<=128;i++){
for(int j=0;j<=128;j++){
for(int x=i-d;x<=i+d;x++){
if(x<0||x>128)continue;
for(int y=j-d;y<=j+d;y++){
if(y<0||y>128)continue;
ans[i][j]+=mp[x][y];
}
}
}
}
int cnt=0,MAX_N=-1;
for(int i=0;i<=128;i++){
for(int j=0;j<=128;j++){
if(MAX_N<ans[i][j]){MAX_N=ans[i][j];cnt=1;}
else if(MAX_N==ans[i][j])cnt++;
}
}
cout<<cnt<<" "<<MAX_N;
return 0;
}