1. 程式人生 > >無線網絡發射器選址

無線網絡發射器選址

name sam 沒有 ret 接下來 badge -m mes etc

題目描述

隨著智能手機的日益普及,人們對無線網的需求日益增大。某城市決定對城市內的公共場所覆蓋無線網。

假設該城市的布局為由嚴格平行的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; }

傳說,越努力的人,越幸運哦!

無線網絡發射器選址