• 洛谷P2038 无线网络发射器选址


    题目描述

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

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

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

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

    现在政府有关部门准备安装一个传播参数为 $d $的无线网络发射器,希望你帮助他们在城市内找出合适的路口作为安装地点,使得覆盖的公共场所最多。

    输入格式

    第一行包含一个整数$ d$,表示无线网络发射器的传播距离。

    第二行包含一个整数 (n),表示有公共场所的路口数目。

    接下来 n 行,每行给出三个整数$ x, y, k,(中间用一个空格隔开,分别代表路口的坐标) (x, y)$ 以及该路口公共场所的数量。同一坐标只会给出一次。

    输出格式

    输出一行,包含两个整数,用一个空格隔开,分别表示能覆盖最多公共场所的安装地点方案数,以及能覆盖的最多公共场所的数量。

    输入输出样例

    输入 #1 复制

    1
    2
    4 4 10
    6 6 20

    输出 #1 复制

    1 30

    说明/提示

    对于(100%)的数据,(1 leq d leq 20, 1 leq n leq 20,0 leq x leq 128 , 0 leq y leq 128 , 0 < k leq 1000000,1≤d≤20,1≤n≤20,0≤x≤128,0≤y≤128,0<k≤1000000)

    解析:

    一道简单的模拟题。

    因为是(129 imes 129)的方阵,所以我们可以枚举每一个点

    然后以该点为中心开始对四周可以扫到的点累加和

    我们开了两个变量来记录,

    (num)记录最大值的个数,(ans)记录最大值,

    有一个显然的结论就是

    我们更换最大值的时候就可以把num替换为1

    与此值相同或者更大的数一定会在后面。

    感性理解。

    #include <cstdio>
    #include <iostream>
    #include <cmath>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <set>
    #define re register
    #define Max 130
    int n,ans = 0,d,g[Max][Max],num;
    inline void init() {
    	scanf("%d%d",&d,&n);int x,y,k;
    	for(re int i = 1 ; i <= n ; ++ i)
    		scanf("%d%d%d",&x,&y,&k),g[x][y] = k;
    }
    void work() {
    	int max_place;
    	for(re int i = 0 ; i <= 128 ; ++ i)
    		for(re int j = 0 ; j <= 128 ; ++ j) {
    			max_place = 0;
    			for(re int a = -d ; a <= d ; ++ a)
    				for(re int b = -d ; b <= d ; ++ b)
    					if(a + i >= 0 && a + i <= 128 && b + j <= 128 && b + j >= 0)//判断边界情况
    						max_place += g[a+i][b+j];
    		if(max_place == ans) num++;
    		if(max_place > ans) ans = max_place, num = 1;
    		}
    }
    inline void print() {printf("%d %d",num,ans);}
    int main() {
    	init();
    	work();
    	print();
    	return 0;
    }
    
  • 相关阅读:
    [重回VB6]简单的QQWeb网游辅助工具开发之旅1、序言,另类的QQ登陆方法
    QQ和360大战我的观点
    不用IE Test ,快速对IE兼容性进行测试
    第八届软件设计大赛完全作品赛前评析与剧透
    屌丝如何分发大文件(大于1G)
    NetDog 酷炫版 0.1测试版发布
    Jquery制作的页码插件
    使用Html5+CSS3摆脱JS做带提示文字的输入框
    在nhibernate中,Load相同ID的实体对象的时候出错的问题!
    fieldset,legend
  • 原文地址:https://www.cnblogs.com/ypay/p/11442907.html
Copyright © 2020-2023  润新知