洛谷 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; }
请各位大佬斧正(反正我不认识斧正是什么意思)