zcmu1578: Sala de aula de auto-estudo

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

Tópico

Uma mesa de assento com comprimento n e largura m tem fontes de ruído k, o que produz ruído com um valor de ruído de s. Sua influência nos arredores diminui drasticamente com a distância. A distância entre dois pontos é a soma de valores absolutos das diferenças de abscissa e ordenada. Pergunte onde o valor do ruído é o menor, a mesma saída pequena i é pequena e a mesma saída j é pequena

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

Ideias

Execute o bfs diretamente na fonte de ruído! No começo eu senti que a profundidade era de até 10, não grande, cada bfs não podia rodar muito, e então apenas 1e4 bfs no máximo, e no final vários tiros, woo woo woo (a matriz vis deve ser limpa a cada vez, 1e4 1e4 operações, é claro t).

Na verdade, você pode enumerar diretamente O (n ^ 2) sem usar bfs, executar onde a fonte de ruído atual pode afetar e, em seguida, modificar diretamente o valor do ruído nesse ponto.

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;
}

 

Acho que você gosta

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