• 牛客练习赛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 }
  • 相关阅读:
    Add Binary
    Java笔记之String
    Java笔记之数组
    Merge Two Sorted Lists
    Remove Nth Node From End of List
    Longest Common Prefix
    Roman to Integer
    Palindrome Number
    Reverse Integer
    _cdel stdcall
  • 原文地址:https://www.cnblogs.com/tingtin/p/9826977.html
Copyright © 2020-2023  润新知