贪心 不知道怎么就对了
扫描透镜
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; } }