【[Offer收割]编程练习赛13 B】最大子矩阵(自己的思路)

摘要:
然后枚举每个格子作为矩形的右下角;用得到的250个左右的成对因子作为矩形的长宽;矩形的元素和用前缀和搞就好;1#includeusingnamespacestd;#definelsonl,m,rt˂˂1#definersonm+1,r,rt˂˂1|1#defineLLlonglong#definerep1for#definerep2for#definempmake_pair#definepspush_back#definefifirst#definesesecond#definereiscanf#definerelscanf#definerefscanftypedefpairpii;typedefpairpll;constintdx[9]={0,1,-1,0,0,-1,-1,1,1};constintdy[9]={0,0,0,-1,1,-1,1,-1,1};constdoublepi=acos;constintN=250+10;intn,m,k,a[N][N],b[500],num=0;intpre[N][N];intsum{returnpre[x2][y2]-pre[x1-1][y2]-pre[x2][y1-1]+pre[x1-1][y1-1];}voidget_yinzi{forifb[++num]=i,b[++num]=t/i;}intget_ans(){forrep1rep1{intkuan=b[t],chang=b[t+1],x0,y0;x0=i-chang+1,y0=j-kuan+1;if{ifreturnchang*kuan;}x0=i-kuan+1,y0=j-chang+1;if{ifreturnchang*kuan;}}return-1;}intmain(){//freopen;rei,rei,rei;rep1rep1rei;rep1rep1pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+a[i][j];rep2get_yinzi;cout˂˂get_ans();//printf;return0;}

【题目链接】:http://hihocoder.com/contest/offers13/problem/2

【题意】

【题解】

算出1..250*250这些数字每个数字的所有因子(成对的那种,即x*y=number),这些成对的因子作为我们要枚举的矩形的长度;
当然加个限制,x<=250,y<=250;
这样1..2502里面总共也只有250个左右的因子;
可以了!
然后枚举每个格子作为矩形的右下角;
用得到的250个左右的成对因子作为矩形的长宽;
(因为要求格子的数目最多,所以在处理出因子的时候,枚举的数字从大到小枚举,这样第一次找到的符合要求的矩形就是答案了)
矩形的元素和用前缀和搞就好;

【Number Of WA

1

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define ps push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 250+10;

int n,m,k,a[N][N],b[500],num=0;
int pre[N][N];

int sum(int x1,int y1,int x2,int y2)
{
    return pre[x2][y2]-pre[x1-1][y2]-pre[x2][y1-1]+pre[x1-1][y1-1];
}

void get_yinzi(int t)
{
    for (int i = 1;i*i<=t;i++)
        if (t%i==0 && i<=250 && t/i<=250)
            b[++num] = i,b[++num]=t/i;
}

int get_ans()
{
    for (int t = 1;t<=num;t+=2)
        rep1(i,1,n)
            rep1(j,1,m)
            {
                int kuan = b[t],chang = b[t+1],x0,y0;
                x0 = i-chang+1,y0 = j-kuan+1;
                if (x0>=1 && y0>=1)
                {
                    if (sum(x0,y0,i,j)<=k) return chang*kuan;
                }
                x0 = i-kuan+1,y0 = j-chang+1;
                if (x0>=1 && y0>=1)
                {
                    if (sum(x0,y0,i,j)<=k) return chang*kuan;
                }
            }
    return -1;
}

int main()
{
    //freopen("F:\rush.txt","r",stdin);
    rei(n),rei(m),rei(k);
    rep1(i,1,n)
        rep1(j,1,m)
            rei(a[i][j]);
    rep1(i,1,n)
        rep1(j,1,m)
            pre[i][j] = pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+a[i][j];
    rep2(i,n*m,1)
        get_yinzi(i);
    cout << get_ans();
    //printf("
%.2lf sec 
", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}

免责声明:文章转载自《【[Offer收割]编程练习赛13 B】最大子矩阵(自己的思路)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇文件备份的三种方式将某个div内容保存成图片,使用html2canvas截图方法(高清图并解决图片跨域问题)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

json(转)

例如:varjsonObj={StudentID:“100”,名称:“tmac”,家乡:“usa”};回到顶部,如何在JS中使用JSON是JS的一个子集,因此您可以轻松地在JS中读写JSON。例如,现在我们有一个TStudent的学生表。表中的字段和现有数据如图所示。从表中,我们可以看到总共五条数据。现在我们需要从数据库中获取这些数据,然后使用JSON.NE...

实用干货丨如何使用Prometheus配置自定义告警规则

前言普罗米修斯是一个用于监控和报警的开源系统。在普罗米修斯的术语中,它所监视的事物被称为目标。在本文中,我们将逐步展示如何安装Prometheus来监控/创建报警,并根据自定义事件配置自定义报警规则。当条件满足时,它将发出警报集成Alertmanager来处理客户端应用程序发送的警报。警报管理器将与发送警报通知的电子邮件帐户集成。了解普罗米修斯操作员根据普罗...

mysql修改字段防止锁表

步骤1:修改大表、addcolumn或dropcolumn的字段,操作完成后将锁定该表。此时,查询ok、insert和update将等待锁定。...

部署springboot+vue项目文档(若依ruoyi项目部署步骤)

1: 部署Linux+nginx部署背景代码1.1因为我使用了idea工具进行开发,所以终端中的mvnclean包生成了相应的jar包。这个jar包可以在相应文件所在目录的目标中找到。linux服务器需要加载redis和nginx。redis存储缓存数据,nginx用于代理前端和后端服务。打包vue项目并将dist文件复制到tomcat的webapps目录中...

如何在Android模拟器上安装apk文件

如本实例的“mishop_2.0.20130911_1.1.1.apk”3.执行控制台命令,进行安装。切换到D盘,输入D:,然后点击Enter,即切换到D盘,输入cd,找到platform-tools的文件地址,即adb.exe的文件路径。,粘贴在控制台中。...

Animation

Animation(function($){functionactive(target,index){varactions=$(target).data('actions');if(index˂actions.length){varcallee=arguments.callee;varaction=actions[index];if(!$(target).d...