牛客练习赛29 B
炎热的早上,gal男神们被迫再操场上列队,gal男神们本来想排列成x∗x的正方形,可是因为操场太小了(也可能是gal男神太大了),校长安排gal男神们站成多个4∗4的正方形(gal男神们可以正好分成n个正方形)但是有些gal男神对于这种站法颇有微词,所以他们把衣服脱下来拿在手上摇晃示威,站在一条直线上的gal男神可以“交头接耳”,交头接耳会使他们联合起来闹事,人数越多,威胁程度就越大。你作为也反对这种站队方式的体育老师,为了助纣为虐,应该以一种“合理”的方式来排布n个gal男神方阵,使得最大的威胁程度最大。输出这个威胁程度。
以下为化简版题干:
现在有n个由0和1组成的4∗4矩阵,你可以任意排列这些矩阵(注意:你不能旋转或者翻转它们),但是每两个矩阵应该恰好对应。即第一列对第一列(或是第一行对第一行)比如说:![](https://uploadfiles.nowcoder.com/files/20181008/309156_1538980509630_iPL3Nj.png)
![](https://uploadfiles.nowcoder.com/files/20181008/309156_1538980509630_iPL3Nj.png)
聪明的你一定可以找到一种排列方法使“连续1的序列最长”。我们定义“连续的1序列”为这个序列仅含1且这个序列不拐弯,它可以是横着或者竖着的。请输出最长的“连续的1序列”长度
输入描述:
第一行一个n。
接下来 4*n行,每行4个数。(仅含0,1)。代表n个0/1矩阵。
输出描述:
一个数字表示最长的“连续的1序列”的长度。
示例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
说明
这回是真良心数据
=
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\n",ans); 116 return 0; 117 }