NC16497. [NOIP2014]无线网路发射器选址
描述
随着智能手机的日益普及,人们对无线网的需求日益增大。某城市决定对城市内的公共场所覆盖无线网。
假设该城市的布局为由严格平行的129条东西向街道和129条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值1。东西向街道从北到南依次编号为0,1,2…128,南北向街道从西到东依次编号为0,1,2…128。
东西向街道和南北向街道相交形成路口,规定编号为x的南北向街道和编号为y的东西向街道形成的路口的坐标是(x, y)。 在某些路口存在一定数量的公共场所。
由于政府财政问题,只能安装一个大型无线网络发射器。该无线网络发射器的传播范围是一个以该点为中心,边长为2*d的正方形。传播范围包括正方形边界。
输入描述
第一行包含一个整数d,表示无线网络发射器的传播距离。
第二行包含一个整数n,表示有公共场所的路口数目。
接下来n行,每行给出三个整数x, y, k, 中间用一个空格隔开,分别代表路口的坐标(x,y)以及该路口公共场所的数量。同一坐标只会给出一次。
输出描述
输出一行,包含两个整数,用一个空格隔开,分别表示能覆盖最多公共场所的安装地点方案数,以及能覆盖的最多公共场所的数量。
示例1
输入:
1 2 4 4 10 6 6 20
输出:
1 30
C++14(g++5.4) 解法, 执行用时: 20ms, 内存消耗: 520K, 提交时间: 2019-11-30 22:48:22
#include<iostream> using namespace std; const int N=130; int d,n,x[N],y[N],g[N][N],ans[N][N],k,ma; int main(){ cin>>d>>n; for(int i=1,a,b,c;i<=n;i++) cin>>a>>b>>c,x[i]=a,y[i]=b,g[a][b]=c; for(int i=0;i<=128;i++) for(int j=0;j<=128;j++){ for(int x1=max(i-d,0);x1<=min(i+d,128);x1++) for(int y1=max(j-d,0);y1<=min(j+d,128);y1++) ans[i][j]+=g[x1][y1]; if(ans[i][j]>ma)ma=ans[i][j],k=0; if(ans[i][j]==ma)k++; } cout<<k<<' '<<ma; }
Python3(3.5.2) 解法, 执行用时: 113ms, 内存消耗: 3556K, 提交时间: 2019-12-21 10:38:00
#! /usr/bin/env python # -*- coding: utf-8 -*- def countk(x, y): out = 0 for i in dots: if abs(x-i[0]) <= d and abs(y-i[1]) <= d: out += i[2] return out d = int(input()) n = int(input()) dots = [] for i in range(n): dots.append(list(map(int, input().split()))) m = 0 q = 0 for i in range(129): for j in range(129): t = countk(i, j) if t > m: m = t q = 1 elif t == m: q += 1 print(q, m)
C++(clang++ 11.0.1) 解法, 执行用时: 7ms, 内存消耗: 464K, 提交时间: 2022-11-25 07:48:06
#include<bits/stdc++.h> using namespace std; int d,n,l[200][200],li,ans,sum,x,y,maxm; int main(){ cin>>d>>n; for(int i=1;i<=n;++i)scanf("%d%d",&x,&y),cin>>l[x+20][y+20]; for(int i=20;i<=148;++i)for(int j=20;j<=148;++j){ for(int m=i-d;m<=i+d;++m)for(int k=j-d;k<=j+d;++k)li+=l[m][k]; if(li==ans)sum++; else if(li>ans)sum=1; ans=max(li,ans),li=0; }cout<<sum<<" "<<ans; }