2017计蒜客noip模拟赛(一)-----蒜头君打地鼠

题目链接:https://nanti.jisuanke.com/t/16445
题目大意:
一个n*n地图,有的点有小鼠,有的没有
K*K正方块的锤子大小,砸向n*n的地图,而且只能斜着砸(旋转45°,蒟蒻不懂)...
问最多能砸“死”多少个小鼠?

思路:
蒟蒻第一次写博客...

正解是方格旋转+二维前缀和
蒟蒻的解法:前缀和+模拟(好像是这样)


#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int  s[2005][2005];

inline int read()//读入优化 
{
    int x=0;char ch=0;
    ch=getchar();
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x;
}
int main()
{
    int n,m,x,ans=0;
    n=read();m=read();
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++){
        x=read();
        s[i][j]=s[i][j-1]+x;//求第i行的前缀和 
    }
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++){
        int maxx=s[i][min(j+m-1,n)]-s[i][max(0,j-m)];//计算当前点当前行的被砸鼠的个数 
        for(int k=1;k<m;k++){//此循环是计算除i行外的其他行的 挨打鼠 
            int r=min(j+m-1-k,n),l=max(0,j-m+k); 
            if(i+k<=n)//求i行下方 
            maxx+=s[i+k][r]-s[i+k][l];
            if(i-k>=1)// 求i行上方 
            maxx+=s[i-k][r]-s[i-k][l];
            
        }
        ans=max(ans,maxx);
        
    }
    cout<<ans;
    return 0;
}

 




posted @ 2017-11-02 12:30  hcute  阅读(330)  评论(0)    收藏  举报