Noip 2014 senior Day2 无线网络发射器选址(wireless)
这道题的大概意思呢就是说,你现在拥有一个路由器(每个都可以发送Wi-Fi),然后那个路由器有一定的范围(因为你又买不起覆盖那么远的),然而你有很多条街道上的很多个路口需要覆盖(随时都可以上网),所以你需要找到你能覆盖最多路口的安装地点方案数,以及路口数量。
经过我详细的分析是不是豁然开朗!(不用你说我也知道是什么意思)怎么做呢?枚举答案就好了。我们在题目所说的那横竖129条街道上(共129 * 129的矩形)枚举,这里唯一需要注意的就是你向左或向右查找范围的时候,注意不要超出边界了。处理呢,一个是把所有的图都扩大,一个是对边界和当前值取一个最大、最小,这样就能保证边界的情况了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define N 150 6 #define inf 0x7fffffff 7 #define pi acos(-1) 8 using namespace std; 9 10 inline long long read(){ 11 long long data=0,w=1; 12 char ch=0; 13 while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar(); 14 if(ch=='-') w=-1,ch=getchar(); 15 while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar(); 16 return data*w; 17 } 18 19 inline void write(long long x) 20 { 21 if(x<0) putchar('-'),x=-x; 22 if(x>9) write(x/10); 23 putchar(x%10+'0'); 24 } 25 26 int maps[N][N]; 27 int d,n; 28 int xi,yi,ki; 29 int sum,maxn; 30 31 int main() 32 { 33 freopen("wireless.in","r",stdin); 34 freopen("wireless.out","w",stdout); 35 36 d = read(); 37 n = read(); 38 for(int i=1;i<=n;i++) 39 { 40 xi = read(); 41 yi = read(); 42 ki = read(); 43 maps[xi][yi] = ki; 44 } 45 for(int i=0;i<=128;i++) 46 { 47 for(int j=0;j<=128;j++) 48 { 49 long long aider = 0; 50 for(int u=max(0,i-d);u<=min(128,i+d);u++) 51 { 52 for(int v=max(0,j-d);v<=min(128,j+d);v++) 53 { 54 aider += maps[u][v]; 55 } 56 } 57 if(aider > maxn) 58 { 59 maxn = aider; 60 sum = 1; 61 } 62 else if(aider == maxn) sum++; 63 } 64 } 65 write(sum); 66 putchar(' '); 67 write(maxn); 68 69 return 0; 70 }