Luogu P2038 無線網路發射器選址
阿新 • • 發佈:2018-12-16
題目描述
隨著智慧手機的日益普及,人們對無線網的需求日益增大。某城市決定對城市內的公共場所覆蓋無線網。
假設該城市的佈局為由嚴格平行的 129129 條東西向街道和 129129 條南北向街道所形成的網格狀,並且相鄰的平行街道之間的距離都是恆定值 11。東西向街道從北到南依次編號為 0,1,2 \dots 1280,1,2…128,南北向街道從西到東依次編號為 0,1,2 \dots 1280,1,2…128。
東西向街道和南北向街道相交形成路口,規定編號為 xx 的南北向街道和編號為 yy 的東西向街道形成的路口的座標是 (x, y)(x,y)。在某些路口存在一定數量的公共場所。
由於政府財政問題,只能安裝一個大型無線網路發射器。該無線網路發射器的傳播範圍是一個以該點為中心,邊長為 2d2d 的正方形。傳播範圍包括正方形邊界。
現在政府有關部門準備安裝一個傳播引數為 dd 的無線網路發射器,希望你幫助他們在城市內找出合適的路口作為安裝地點,使得覆蓋的公共場所最多。
輸入輸出格式
輸入格式:
第一行包含一個整數 dd,表示無線網路發射器的傳播距離。
第二行包含一個整數 nn,表示有公共場所的路口數目。
接下來 nn 行,每行給出三個整數 x, y, kx,y,k,中間用一個空格隔開,分別代表路口的座標 (x, y)(x,y) 以及該路口公共場所的數量。同一座標只會給出一次。
輸出格式:
輸出一行,包含兩個整數,用一個空格隔開,分別表示能覆蓋最多公共場所的安裝地點方案數,以及能覆蓋的最多公共場所的數量。
列舉中間點,搞一搞即可
#include<cstdio> #include<cmath> using namespace std; const int N=100; int n,d,x[N],y[N],w[N],s,ans,num; int main() { scanf("%d%d",&d,&n); for(int i=1;i<=n;i++) scanf("%d%d%d",&x[i],&y[i],&w[i]); ans=num=0; for(int i=0;i<=128;i++) for(int j=0;j<=128;j++) { s=0; for(int k=1;k<=n;k++) if(abs(x[k]-i)<=d&&abs(y[k]-j)<=d) s+=w[k]; if(s>ans) ans=s,num=1; else if(s==ans) num++; } printf("%d %d\n",num,ans); return 0; }