题解 | #时不时使使用玉米加农炮掩饰害羞的邻座艾莉同学#

时不时使使用玉米加农炮掩饰害羞的邻座艾莉同学

https://ac.nowcoder.com/acm/contest/120564/H

H题
由题意得,在每次增援后,都需要找出一个点,使距离他的曼哈顿距离不超过2的13个点之和最大(包括该点在内),每一次增援只会影响到该增援的点在内的13个点,那么可以直接用一个二维数组直接记录某一个位置和他周围点的和,即直接记录使用玉米加农炮落在该点时消灭的敌人数量,一开始填充完数组之后,直接遍历一遍,找出最大值,并记录点坐标,在每次增援后都要让增援所影响的13个点都和最大值去比较,再次更新
#include <bits/stdc++.h>
using namespace std;
int dx[13]={0,0,1,2,0,0,-1,-2,1,1,-1,-1,0};
int dy[13]={1,2,0,0,-1,-2,0,0,1,-1,1,-1,0};
int main(){
    int n,m,q;cin>>n>>m>>q;
    long long a[520][520];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int a1;cin>>a1;
            for(int k=0;k<13;k++){
                if((i+dx[k])<1||(j+dy[k])<1) continue;
                a[i+dx[k]][j+dy[k]]+=a1;
            }
        }
    }
    long long max=0;
    int p1=0,p2=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]>max) {
                max=a[i][j];
                p1=i;p2=j;
            }
        }
    }
    while(q--){
        int x,y,z;cin>>x>>y>>z;
        for(int i=0;i<13;i++){
            if((x+dx[i])<1||(y+dy[i])<1) continue;
            a[x+dx[i]][y+dy[i]]+=z;
            if(a[x+dx[i]][y+dy[i]]>max){
                max=a[x+dx[i]][y+dy[i]];
                p1=x+dx[i];p2=y+dy[i];
            }
        }
        cout<<p1<<" "<<p2<<endl;
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务