【普组模拟赛】马农(farmer.pas/cpp)

【普组模拟赛】马农(farmer.pas/cpp)

题目描述:

 在观看完战马检阅之后,来自大草原的两兄弟决心成为超级“马农”,专门饲养战马。
兄弟两回到草原,将可以养马的区域,分为 N*N 的单位面积的正方形, 并实地进行考察,归纳出了每个单位面积可以养马所获得的收益。接下来就要开始规划他们各自的马场了。
          首先,两人的马场都必须是矩形区域。同时,为了方便两人互相照应,也为了防止马匹互相走散,规定两个马场的矩形区域相邻,且只有一个交点。最后,互不认输的两人希望两个马场的收益相当,这样才不会影响他们兄弟的感情。
          现在,兄弟两找到你这位设计师,希望你给他们设计马场,问共有多少种设计方案。

输入

 第一行一个整数 N,表示整个草原的大小为 N*N。
接下来 N 行,每行 N 个整数 A(i,j),表示第 i 行第 j 列的单位草地的收成。
(注意:收益可能是负数,养马也不是包赚的,马匹也可能出现生病死亡等意外。)

输出

输出符合两人要求的草原分配方案数。

样例输入

3
1 2 3
4 5 6
7 8 9

样例输出

2

【样例解释】

数据范围限制

【数据范围】
40%的数据, N<=10。
100%的数据, N<=50, -1000<A(i,j)<1000。

分析:这道题其实我也没想到很好的方法,看了大佬的题解后,瞬间崩溃,还是好好做暴力吧!
暴力?暴力能过?
*其实我也不知道,可能是JZOJ的数据太水了,数据大,I don’t know! QWQ *
进入正题,我们每次去枚举一个交点即(i,j)因为题目规定只能有一个交点,然后去暴力交点的四个方向(左上,右上,左下,右下)
在这里插入图片描述

因为题目规定只能有一个交点,所以我们每次暴力是,只需要对角暴力即可,
(1和4),(2和3);

怎样去判断它们有多少块田收益相同呢?
其实并没有那么难,我们只需在读入时做前缀和的操作就行了。

在这里插入图片描述

这公式是怎么得到的?
如果我们要求出这块田的收益是多少,跟他同行的前一块田的收益(绿色部分, b[i][j-1])
和它同一列的上一行的田地收益(红色部分,b[i-1][j]),最后加上我们输入的当前的小田的收益(棕色部分,a),当我们加完后,可以明显的看到,田地有重复的地方(粉色部分b[i-1][j-1]),管他三七二十一,减掉就行了。

又到了激动人心的时刻
上AC代码

#include<cstdio>
using namespace std;
int n,s,a,b[1005][1005],c[10000005];
int main()
{
   
	//freopen("farmer.in","r",stdin);
	//freopen("farmer.out","w",stdout);
	cin>>n;
	for(int i=1
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值