题解 【[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;
}

后记

这可能只是一个坑,如果后面有更好的解法可能会填充(¿

还有我好像在编辑的时候发现代码有一点问题,为什么还能过啊。

只能说数据不行。

posted @ 2020-03-05 17:35  Kriraya  阅读(136)  评论(0)    收藏  举报