题解 【[USACO14MAR]The Lazy Cow S】
原题链接:Link
前言
挺好玩的一道题,因为数据范围太小直接 \(O(n^3)\) 过了,还是一遍过。
此文章不同步于洛谷 blog ,因为博主觉得 \(O(n^3)\) 过了太丢脸发了还是误导别人。
解题思路
奶牛能吃到的草其实就是一个菱形的面积,所以我们定义数组a,a[i][j]表示第i行前j个数的和,然后再直接求出菱形中所有数的值就行了。
\(O(n^3)\) 明显容易很多,也很好打,所以如果这题不加强数据我觉得用 \(O(n^3)\) 最多黄题。
细节实现看代码。
代码
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[401][401];//400的数据明显小了
int wyxak(int x,int y){// WYXkk Ak IOI!
int sum=0;
for(int i=x-k;i<=x+k;i++){
if(i>n) break;
if(i<0) continue;//判断边界,稍微注意一下小于0时不能直接跳出
int l,r;//处理菱形
if(i<=x){
l=y-(i-x+k);
r=y+(i-x+k);
}
else{
l=y-(x+k-i);
r=y+(x+k-i);
}//菱形处理完毕
int flag=1;
if(l<1){
l=1;
flag=0;
}//若不符合条件直接旗子倒下
if(r>n){
r=n;
flag=0;
}//同上
sum+=a[i][r]-a[i][l-1];
if(flag==0) break;//旗子若倒下直接跳出
}
return sum;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int x;
cin>>x;
a[i][j]=a[i][j-1]+x;//处理前缀和
}
}
int ans=-0x3ffff;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
ans=max(ans,wyxak(i,j));//每个搜索,求max
}
}
cout<<ans;
return 0;
}
后记
这可能只是一个坑,如果后面有更好的解法可能会填充(¿
还有我好像在编辑的时候发现代码有一点问题,为什么还能过啊。
只能说数据不行。
不管多么痛苦,都不要逃往轻松的那一边。
浙公网安备 33010602011771号