zcmu1578: Classe d'auto-apprentissage

Lien titre: https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1578

Sujet

Une table de siège d'une longueur de n et d'une largeur de m a k sources de bruit, ce qui produit un bruit avec une valeur de bruit de s. Son influence sur l'environnement diminue fortement en fonction de la distance. La distance entre deux points est la somme des valeurs absolues des différences d'abscisse et d'ordonnée. Demandez où la valeur de bruit est la plus petite, la même petite sortie i est petite et la même sortie j est petite

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

Idées

Exécutez bfs directement sur la source de bruit! Au début, j'ai senti que la profondeur était jusqu'à 10, pas grande, chaque bfs ne pouvait pas tourner beaucoup, puis seulement 1e4 bfs au plus, et à la fin plusieurs plans, woo woo woo (le tableau de vis doit être effacé à chaque fois, 1e4 1e4 opérations, bien sûr t).

En fait, vous pouvez directement énumérer O (n ^ 2) sans utiliser bfs, exécuter là où la source de bruit actuelle peut affecter, puis modifier directement la valeur du bruit à ce point.

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

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43911947/article/details/112772246
conseillé
Classement