牛客练习赛29 B

炎热的早上,gal男神们被迫再操场上列队,gal男神们本来想排列成x∗x的正方形,可是因为操场太小了(也可能是gal男神太大了),校长安排gal男神们站成多个4∗4的正方形(gal男神们可以正好分成n个正方形)但是有些gal男神对于这种站法颇有微词,所以他们把衣服脱下来拿在手上摇晃示威,站在一条直线上的gal男神可以“交头接耳”,交头接耳会使他们联合起来闹事,人数越多,威胁程度就越大。你作为也反对这种站队方式的体育老师,为了助纣为虐,应该以一种“合理”的方式来排布n个gal男神方阵,使得最大的威胁程度最大。输出这个威胁程度。
以下为化简版题干:
现在有n个由0和1组成的4∗4矩阵,你可以任意排列这些矩阵(注意:你不能旋转或者翻转它们),但是每两个矩阵应该恰好对应。即第一列对第一列(或是第一行对第一行)比如说:
聪明的你一定可以找到一种排列方法使“连续1的序列最长”。我们定义“连续的1序列”为这个序列仅含1且这个序列不拐弯,它可以是横着或者竖着的。请输出最长的“连续的1序列”长度

输入描述:

第一行一个n。
接下来 4*n行,每行4个数。(仅含0,1)。代表n个0/1矩阵。

输出描述:

一个数字表示最长的“连续的1序列”的长度。
示例1

输入

复制
1
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

输出

复制
4

说明

良心样例1
示例2

输入

复制
1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

输出

复制
0

说明

良心样例2
示例3

输入

复制
3
1 0 1 0 
0 0 1 0 
1 0 1 0 
0 1 0 1 

1 0 1 0 
0 1 1 1 
1 0 1 1 
1 1 1 0 

1 0 1 1 
0 1 0 0 
0 1 0 0 
0 0 0 1 

输出

复制
7

说明

这回是真良心数据

=
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <string>
  7 #include <deque>
  8 #include <set>
  9 #include <queue>
 10 #include <cmath>
 11 #define ll   long long
 12 using namespace std;
 13 const int N = 1e5+9;
 14 int cnt1[N],cnt2[N];
 15 int a[N][6][6],b[6][6];
 16 int l[6],r[6],u[6],d[6];
 17 int n;
 18 //0 从左到右,1从右到左 ,2 上 ,3下
 19 int  main()
 20 {
 21     scanf("%d",&n);
 22     for(int i=1;i<=n;i++)
 23     {
 24         for(int  j=1;j<=4;j++){
 25             for(int  k=1;k<=4;k++){
 26                 scanf("%d",&b[j][k]);
 27             }
 28         }
 29     for(int  j=1;j<=4;j++){
 30             for(int k=1;k<=5;k++){//5的目的时为了确定这一行是否都是1
 31                 if(!b[j][k]){
 32                     a[i][j][0]=k-1;//第i个矩阵第j行从左到右第1个0之前有a[i][j][0]个1
 33                     break;
 34                 }
 35             }
 36         }
 37     for(int  j=1;j<=4;j++){
 38             for(int k=4;k>=1;k--){
 39                 if(!b[j][k]){
 40                     a[i][j][1]=4-k;
 41                     break;
 42                 }
 43             }
 44         }
 45     for(int  j=1;j<=4;j++){
 46             for(int k=1;k<=5;k++){
 47                 if(!b[k][j]){
 48                     a[i][j][2]=k-1;
 49     
 50                     break;
 51                 }
 52             }
 53         }
 54     for(int  j=1;j<=4;j++){
 55             for(int k=4;k>=1;k--){
 56                 if(!b[k][j]){
 57                     a[i][j][3]=4-k;
 58                     break;
 59                 }
 60             }
 61         }
 62         
 63     }
 64     //横着
 65     int ans = 0;
 66     for(int  i=1;i<=n;i++){
 67         for(int j=1;j<=4;j++){
 68             if(a[i][j][0]==4){
 69                 cnt1[j]++;
 70             }
 71             else{
 72                 if(a[i][j][0]>l[j]&&a[i][j][1]>r[j]){
 73                     if(a[i][j][0]>a[i][j][1]){//1个矩阵只能放在一个位置
 74                         l[j]=a[i][j][0];
 75                     }
 76                     else{
 77                         r[j]=a[i][j][1];
 78                     }
 79                 }
 80                 else{
 81                     l[j]=max(l[j],a[i][j][0]);
 82                     r[j]=max(r[j],a[i][j][1]);
 83                 }
 84             }
 85         }        
 86     }
 87     for(int  i=1;i<=4;i++){
 88             ans=max(ans,cnt1[i]*4+l[i]+r[i]);//后缀1序列+全1序列+前缀1序列
 89         }        
 90         //竖着
 91         for(int  i=1;i<=n;i++){
 92         for(int j=1;j<=4;j++){
 93             if(a[i][j][2]==4){
 94                 cnt2[j]++;
 95             }
 96             else{
 97                 if(a[i][j][2]>u[j]&&a[i][j][3]>d[j]){
 98                     if(a[i][j][2]>a[i][j][3]){
 99                         u[j]=a[i][j][2];
100                     }
101                     else{
102                         d[j]=a[i][j][3];
103                     }
104                 }
105                 else{
106                     u[j]=max(u[j],a[i][j][2]);
107                     d[j]=max(d[j],a[i][j][3]);
108                 }
109             }
110         }        
111     }
112     for(int  i=1;i<=4;i++){
113             ans=max(ans,cnt2[i]*4+u[i]+d[i]);
114         }
115         printf("%d
",ans);
116         return   0;        
117 }
原文地址:https://www.cnblogs.com/tingtin/p/9826977.html