zcmu1578: 自习教室

题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1578

题目大意

长为n宽为m的座位表,有k个噪音源,产生噪音值为s的噪音,他对周围的影响按照距离骤减,两点之间距离是横纵坐标差的绝对值之和,问哪个位置噪音值最小,一样小的输出i较小的,还一样输出j小的

范围:(0<n,m<100,0<=k<=n*m,0<=i<n,0<=j<m,0<s<10)

思路

直接对噪音源跑bfs会t!刚开始觉得深度最多10,不大,每个bfs跑不了多少,然后最多也才1e4个bfs呀,最后t了好几发,呜呜呜(每次都要清空vis数组,1e4个1e4操作,当然t啦)。

其实可以不用bfs,直接枚举O(n^2),跑当前噪音源能影响到的地方,然后直接修改该点的噪音值。

ac代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ok(x, y) x >= 0 && x < n && y >= 0 && y < m //宏定义比调用函数快一点
int a[105][105];
int n, m;
int main(){
    int k;
    while(~scanf("%d%d%d", &n, &m, &k)){
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < m; j ++){
                a[i][j] = 0;
            }
        }
        int x, y, s, dx, dy;
        while(k --){
            scanf("%d%d%d", &x, &y, &s);
            a[x][y] += s;
            for(int i = 1; i < s; i ++){ //这里要分开处理,不能放在下面的循环里面,因为a[x+0][y+j]和a[x-0][y+j]一样,会重复累加
                if(ok(x, y + i)) a[x][y + i] += s - i;
                if(ok(x, y - i)) a[x][y - i] += s - i;
                if(ok(x + i, y)) a[x + i][y] += s - i;
                if(ok(x - i, y)) a[x - i][y] += s - i;
            }
            for(int i = 1; i < s; i ++){
                for(int j = 1; j < s; j ++){
                    if(i + j >= s) continue; //距离不能超过s,当然等于s的时候加0,也就不跑了
                    dx = x + i, dy = y + j;
                    if(ok(dx, dy)) a[dx][dy] += s - i - j;
                    
                    dx = x + i, dy = y - j;
                    if(ok(dx, dy)) a[dx][dy] += s - i - j;
                    
                    dx = x - i, dy = y + j;
                    if(ok(dx, dy)) a[dx][dy] += s - i - j;
                    
                    dx = x - i, dy = y - j;
                    if(ok(dx, dy)) a[dx][dy] += s - i - j;
                }
            }
        }
        int ans = 0x3f3f3f3f, ansx, ansy;
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < m; j ++){
                if(ans > a[i][j]){
                    ansx = i, ansy = j;
                    ans = a[i][j];
                }
            }
        }
        printf("%d %d %d\n", ansx, ansy, ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43911947/article/details/112772246