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

每日一题 day9 打卡

Analysis

这道题是个模拟,两个0~128( 注意不是1~128 )的循环枚举正方形中心点,判断正方形的边界,再用循环枚举公共场所的数量就好了。

时间复杂度 < O (128 ² × 160 ² ) = O ( 419430400 ) 可以接受

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 128+10
using namespace std;
inline int read() 
{
    int x=0;
    bool f=1;
    char c=getchar();
    for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
    for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
    if(f) return x;
    return 0-x;
}
inline void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
int d,n;
int map[maxn][maxn];
int ans_num,ans_sum=-1;
int main()
{
    memset(map,0,sizeof(map));
    d=read();
    n=read();
    for(int i=1;i<=n;i++) 
    {
        int x=read(),y=read(),k=read();
        map[x][y]=k;
    }
    for(int i=0;i<=128;i++)
        for(int j=0;j<=128;j++)
        {
            int xi=0,yi=0,xj=0,yj=0,cnt=0;
            if(i-d<0) xi=0;
            else xi=i-d;
            if(i+d>128) yi=128;
            else yi=i+d; 
            if(j-d<0) xj=0;
            else xj=j-d;
            if(j+d>128) yj=128;
            else yj=j+d; 
            for(int ei=xi;ei<=yi;ei++)
                for(int ej=xj;ej<=yj;ej++)
                {
                    cnt+=map[ei][ej];
                }
            if(cnt>ans_sum) 
            {
                ans_sum=cnt;
                ans_num=1;
            }
            else if(cnt==ans_sum) ans_num++;
        }
    write(ans_num);
    printf(" ");
    write(ans_sum);
    return 0;
} 

 请各位大佬斧正(反正我不认识斧正是什么意思)

原文地址:https://www.cnblogs.com/handsome-zyc/p/11517560.html