2019牛客暑期多校2H题

登录—专业IT笔试面试备考平台_牛客网

https://ac.nowcoder.com/acm/contest/882/H

Given a N×M binary matrix. Please output the size of second large rectangle containing all "1".

Containing all "1" means that the entries of the rectangle are all "1".

A rectangle can be defined as four integers x1,y1,x2,y2 where 1x1x2N and 1y1y2M. Then, the rectangle is composed of all the cell (x, y) where x1xx2 and y1yy2. If all of the cell in the rectangle is "1", this is a valid rectangle.

Please find out the size of the second largest rectangle, two rectangles are different if exists a cell belonged to one of them but not belonged to the other.

输入描述:

The first line of input contains two space-separated integers N and M.
Following N lines each contains M characters cij. 1N,M1000 N×M2 cij"01" 

输出描述:

Output one line containing an integer representing the answer. If there are less than 2 rectangles containning all "1""1", output "0""0".

题意大概就是让你找第二大的全‘1’子矩阵,递推处理,f[i][j]表示第i行,第j列时,从i能延伸的最大全1长度。记录l和r两个数组,分别表示能向左或右扩展的最大位置。
具体内容在代码里注释,原谅我给某个小仙女口头说不清(尬笑
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3fffffff
#define maxn 1005
#define mod 1000000000
int l[maxn],r[maxn];
int f[maxn][maxn],n,m;
int main(){
    scanf("%d%d%*c",&n,&m);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j){
            char x=getchar();
            if(x=='1')
                f[i][j]=f[i-1][j]+1;
            else
                f[i][j]=0;//f[i][j]储存的是当前纵向连续'1'的个数
        }
        getchar();
    }
    int ans=0,ans2=0;//ans记录当前最大值,ans2记录第二大
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j)
            l[j]=r[j]=j;
        f[i][0]=f[i][m+1]=-1;
        for(int j=1;j<=m;++j){
            while(f[i][j]<=f[i][l[j]-1])
                l[j]=l[l[j]-1];//如果当前纵向长度小于左边,则说明可以组成矩阵,一直向左寻找到最后一个大于等于当前纵向长度为止
        }
        for(int j=m;j>=1;--j){
            while(f[i][j]<=f[i][r[j]+1])
                r[j]=r[r[j]+1];//向右寻找同理
        }
        int k1,k2;
        for(int j=1;j<=m;++j){
            if(f[i][j]){
                int t=(r[j]-l[j]+1)*f[i][j];//左右长度乘高度就是面积
                if(t>ans){
                    ans2=ans;
                    ans=t;
                    k1=l[j];
                    k2=i;//如果更新了,记录当前最大矩阵的位置,防止搜索到相同矩阵重复记录
                }
                else if(t>ans2&&(l[j]!=k1||k2!=i))//防重
                    ans2=t;
                t=max((r[j]-l[j])*f[i][j],(r[j]-l[j]+1)*(f[i][j]-1));//(高度-1)*长度和(长度-1)*高度,找大的一方和第二大矩阵面积比较,更新答案
                if(t>ans2)
                    ans2=t;
            }
        }
    }
    printf("%d\n",ans2);
}

全部评论

相关推荐

已经入职字节快一个月了,突然想起来之前那段时间的面经没有发,先发一下timeline吧。Tiktok&nbsp;内容安全平台(人才库电话捞我):电话10.28&nbsp;-&gt;&nbsp;一面10.30(我觉得你跟我们组业务挺match的,然后过了三天问hr挂了,应该是别人流程更快)阿里淘天:投递11.11-&gt;约面11.12-&gt;一面11.14(问得很简单,30分钟,手撕八股全过无后续)Kpi面腾讯wxg&nbsp;微信小程序:投递11.13&nbsp;-&gt;约面11.14-&gt;&nbsp;一面11.17&nbsp;(究极无敌拷打,问我多模态大模型涉及的算法?但是人很好)-&gt;11.19流程终止小红书&nbsp;风控平台:投递11.16&nbsp;—约面11.17&nbsp;&nbsp;-&gt;一面11.18&nbsp;(抽象的面试官,面试感觉一般,问得前端网页安全相关的,确实没准备)-&gt;11.20挂百度&nbsp;百家号:投递11.14&nbsp;—&gt;约面11.14&nbsp;-&gt;一面11.14(当场约2面)-&gt;二面11.24-&gt;口头告知offer,&nbsp;拒绝(原因是业务不太好)美团&nbsp;技术平台投递11.17&nbsp;-&gt;&nbsp;约面(忘记了,没多久)&nbsp;-&gt;一面11.19&nbsp;-&gt;二面11.21&nbsp;(字节offer不想面了)快手&nbsp;电商业务投递11.17&nbsp;-&gt;&nbsp;约面11.18&nbsp;-&gt;一面11.19&nbsp;-&gt;&nbsp;二面11.21(拒了)腾讯wxg&nbsp;微信支付(被捞):(直接发面试邮件)技术一面12.05&nbsp;-&gt;技术二面12.11&nbsp;-&gt;技术三面12.17&nbsp;-&gt;&nbsp;hr面已拒绝(了解业务后拒绝,但是有转正hc,感觉还蛮可惜)字节跳动&nbsp;xxxx:东家就不放具体的时间线了,大概是面完第二天就能知道结果,除了有几天ld请假了没填面评。不去wxg还有个原因是还在期末周,深圳学校来回太麻烦了,至少现在在的组感觉能学到很多的东西,自己的选择应该也没错。还是感概一下,一年前大二的时候投简历海投基本上石沉大海,无论大小厂约面比例很少。现在基本上投了就有面试,还都是以前梦寐以求的大厂,现在自己也有了更多的选择,也没有投太多简历。也感谢上一段实习的经历,很有意思的项目,无论是字节,腾讯,还是美团基本都有聊这个项目。面经需要等一下,也许等周末有空了再发给各位uu,感兴趣可以关注一下~有想要交流学习的同学也可以私信我,目前人在北京大钟寺~,可以找搭子~
正能量的牛可乐:这么多大厂面试下来,不仅摸清了不同公司的面试风格,还能精准避雷业务不匹配的岗位,血赚
实习简历求拷打
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务