無線網絡發射器選址
題目描述
隨著智能手機的日益普及,人們對無線網的需求日益增大。某城市決定對城市內的公共場所覆蓋無線網。
假設該城市的布局為由嚴格平行的129 條東西向街道和129 條南北向街道所形成的網格狀,並且相鄰的平行街道之間的距離都是恒定值 1 。東西向街道從北到南依次編號為0,1,2…128 , 南北向街道從西到東依次編號為0,1,2…128 。
東西向街道和南北向街道相交形成路口,規定編號為x 的南北向街道和編號為y 的東西向街道形成的路口的坐標是(x , y )。 在 某 些 路口存在一定數量的公共場所 。
由於政府財政問題,只能安裝一個大型無線網絡發射器。該無線網絡發射器的傳播範圍
一個以該點為中心,邊長為2*d 的正方形。傳播範圍包括正方形邊界。
例如下圖是一個d = 1 的無線網絡發射器的覆蓋範圍示意圖。
現在政府有關部門準備安裝一個傳播參數為d 的無線網絡發射器,希望你幫助他們在城市內找出合適的安裝地點,使得覆蓋的公共場所最多。
輸入輸出格式
輸入格式:
輸入文件名為wireless.in。
第一行包含一個整數d ,表示無線網絡發射器的傳播距離。
第二行包含一個整數n ,表示有公共場所的路口數目。
接下來n 行,每行給出三個整數x , y , k , 中間用一個空格隔開,分別代表路口的坐標( x , y )
以及該路口公共場所的數量。同一坐標只會給出一次。
輸出格式:
輸出文件名為wireless.out 。
輸出一行,包含兩個整數,用一個空格隔開,分別表示能覆蓋最多公共場所的安裝地點 方案數,以及能覆蓋的最多公共場所的數量。
輸入輸出樣例
輸入樣例#1:1 2 4 4 10 6 6 20輸出樣例#1:
1 30
說明
對於100%的數據,1≤d≤20,1≤n≤20, 0≤x≤128,0≤y≤128,0<k≤1,000,000。
沒有註意的點:
到了邊界的時候,也是能被覆蓋的。
但是我沒有想到,直接舍棄了,所以這道容易題一直WA。
學到的:一定要認真讀題。
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<vector> #define ll long long #define mod 10007 using namespace std; inline int read() { int x=0,w=1;char ch=getchar(); while(!isdigit(ch)){if(ch==‘-‘) w=-1;ch=getchar();} while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar(); return x*w; } const int N=200; int n,d,sum[N][N],a[N][N]; int ans1,ans2; int Get(int x1,int y1,int x2,int y2) { x1=max(1,x1);y1=max(y1,1); x2=min(x2,129);y2=min(y2,129); return sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]; } int main() { d=read();n=read(); for(int i=1;i<=n;++i) { int x,y;x=read();y=read();x++;y++; swap(x,y); a[x][y]=read(); } for(int i=1;i<=129;++i) for(int j=1;j<=129;++j) sum[i][j]=sum[i-1][j]+sum[i][j-1]+a[i][j]-sum[i-1][j-1]; ans1=-1;ans2=0; for(int i=1;i<=129;++i) for(int j=1;j<=129;++j) { int tot=Get(i-d,j-d,i+d,j+d); if(tot>ans1) ans1=tot,ans2=1; else if(tot==ans1) ans2++; } printf("%d %d",ans2,ans1); return 0; }
傳說,越努力的人,越幸運哦!
無線網絡發射器選址