贪心 不知道怎么就对了

扫描透镜

http://www.nowcoder.com/questionTerminal/6a219d196df44d3abd82fbadb1a62c3f

由于格子比较少,且只有两次机会,可以直接扫描每个格子周围有几个格子不为空,然后选出最大的值
一个很神奇的点是,如果当前有多个备选项值相等,那么总是选最后一个
想了想,可能是这样的点往往位于偏右下角的位置,不容易造成全局上的影响

#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
using namespace std;
int n,m,k;
bool check(int x,int y){
    return (x>=0&&x<n&&y>=0&&y<m);
}
// void calc(const vector<vector<int>> &matrix,vector<vector<int>> &map,int x,int y)
// {
//     for(int i=-1;i<=1;++i)
//     {
//         for(int j=-1;j<=1;++j){
//             int dx = x+i,dy=y+j;
//             if(check(dx,dy))
//                 map[x][y] += matrix[dx][dy]>0?1:0;
//         }
//     }
// }
int calc2(const vector<vector<int>> &matrix,int x,int y)
{
    int ans=0;
    for(int i=-1;i<=1;++i)
    {
        for(int j=-1;j<=1;++j){
            int dx = x+i,dy=y+j;
            if(check(dx,dy))
                ans += matrix[dx][dy]>0?1:0;
        }
    }
    return ans;
}
void sweep(vector<vector<int>> &matrix,int x,int y)
{
    for(int i=-1;i<=1;++i)
    {
        for(int j=-1;j<=1;++j){
            int dx = x+i,dy=y+j;
            if(check(dx,dy)&&matrix[dx][dy]>0)
                matrix[dx][dy] -= 1;
        }
    }
}
int main(){


    while(scanf("%d %d %d",&n,&m,&k)!=EOF){
        vector<vector<int>> matrix(n,vector<int>(m,0));
        int x,y;
        int ans=0;
        for(int i=0;i<k;++i)
        {
            scanf("%d %d",&x,&y);
            matrix[x-1][y-1]++;
        }
        int two = 2;
        int nowMax;
        pair<int,int> coord;
        while(two--)
        {
            nowMax = 0;
            //vector<vector<int>> map(n,vector<int>(m,0));
            for(int i=0;i<n;++i){
                for(int j=0;j<m;++j){
                    //cout<<matrix[i][j]<<" ";
                    //calc(matrix,map,i,j);
                    int now = calc2(matrix,i,j);
                    if(now>=nowMax){
                        nowMax= now;
                        coord = make_pair(i,j);
                    }
                }
                //cout<<endl;
            }
            sweep(matrix,coord.first,coord.second);
            ans+=nowMax;
            //cout<<endl;
        }
        cout<<ans<<endl;
    }
}
全部评论

相关推荐

微风不断:兄弟,你把四旋翼都做出来了那个挺难的吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务