zcmu1578: Aula de autoaprendizaje

Enlace de título: https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1578

Tema

Una mesa de asiento con una longitud de n y un ancho de m tiene k fuentes de ruido, lo que produce un ruido con un valor de ruido de s. Su influencia en el entorno disminuye considerablemente según la distancia. La distancia entre dos puntos es la suma de los valores absolutos de las diferencias en abscisas y ordenadas. Pregunte dónde el valor de ruido es el más pequeño, la misma salida pequeña i es pequeña y la misma salida j es pequeña

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

Ideas

Ejecute bfs directamente en la fuente de ruido. Al principio sentí que la profundidad era de hasta 10, no era grande, cada bfs no podía correr mucho, y luego solo 1e4 bfs como máximo, y al final varios disparos, woo woo woo (la matriz de vis debe limpiarse cada vez, 1e4 1e4 operaciones, por supuesto t).

De hecho, puede enumerar directamente O (n ^ 2) sin usar bfs, ejecutar donde pueda afectar la fuente de ruido actual y luego modificar directamente el valor de ruido en ese punto.

código 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;
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43911947/article/details/112772246
Recomendado
Clasificación