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; }
本人蒟蒻,欢迎各dalao指教

浙公网安备 33010602011771号