列表

详情


NC16497. [NOIP2014]无线网路发射器选址

描述

随着智能手机的日益普及,人们对无线网的需求日益增大。某城市决定对城市内的公共场所覆盖无线网。

假设该城市的布局为由严格平行的129条东西向街道和129条南北向街道所形成的网格状,并且相邻的平行街道之间的距离都是恒定值1。东西向街道从北到南依次编号为0,1,2128,南北向街道从西到东依次编号为0,1,2128

东西向街道和南北向街道相交形成路口,规定编号为x的南北向街道和编号为y的东西向街道形成的路口的坐标是(x, y)。 在某些路口存在一定数量的公共场所。

由于政府财政问题,只能安装一个大型无线网络发射器。该无线网络发射器的传播范围是一个以该点为中心,边长为2*d的正方形。传播范围包括正方形边界。

例如下图是一个d = 1的无线网络发射器的覆盖范围示意图。
   
现在政府有关部门准备安装一个传播参数为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;
}

上一题