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

P2038 無線網絡發射器選址

數組越界 輸出 namespace 題目 != map 你會 sed min

P2038 無線網絡發射器選址

題目描述

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

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

題解:

  註意數組越界 如果這是真的考試 你會因為數組越界問題而丟掉100分

技術分享
#include<cstdio>
#include
<iostream> #include<algorithm> using namespace std; const int c = 20; int d,n,map[150][150],num[150][150],f[150][150],tmp[22500]; int cmp(int a,int b) { return a>b; } int main() { scanf("%d%d",&d,&n); int minx=0x7fffffff,miny=0x7fffffff,maxx=-1,maxy=-1; for(int i=0; i<n; i++) { int x,y,z[180]; scanf("%d%d%d",&x,&y,&z[i+c]); map[x+c][y+c]=z[i+c]; } for(int i=c; i<=128+c; i++) { for(int j=c; j<=128+c; j++) { int a=i+d,b=j+d,c=i-d,e=j-d,tot=0; for(int q=c; q<=a; q++) for(int p=e; p<=b; p++) tot+=map[q][p]; f[i][j]=tot; } } int num=0; for(int i=c; i<=128+c; i++) for(int j=c; j<=128+c; j++) tmp[++num]=f[i][j]; sort(tmp+1,tmp+num+1,cmp); int ans1,ans2; for(int i=1; i<=num; i++) { if(tmp[i]!=tmp[i+1]) { ans1=i; ans2=tmp[i]; printf("%d %d",ans1,ans2); return 0; } } return 0; }
無線網絡發射器選址

自己選的路,跪著也要走完!!!

P2038 無線網絡發射器選址