zcmu1578:自習教室

タイトルリンク:https//acm.zcmu.edu.cn/JudgeOnline/problem.php?id = 1578

トピック

長さn、幅mのシートテーブルにはk個の騒音源があり、騒音値sの騒音が発生します。距離に応じて周囲への影響は急激に減少します。2点間の距離は横軸と縦軸の差の絶対値ノイズ値が最小で、同じ小さな出力iが小さく、同じ出力jが小さい場所を尋ねます

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

アイデア

ノイズ源で直接bfsを実行してください!最初は、深さが最大10で、大きくはなく、各bfsはあまり実行できず、最大で1e4 bfsしか実行できないと感じました。最後に、いくつかのショットで、woo woo woo(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