NC19843. 列队
描述
输入描述
第一行一个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
说明:
这回是真良心数据C++14(g++5.4) 解法, 执行用时: 179ms, 内存消耗: 7652K, 提交时间: 2018-10-19 20:33:41
#include<bits/stdc++.h> #define xx first #define yy second #define mp make_pair #define pb push_back using namespace std; typedef long long ll; typedef pair<int,int> pii; const int MAXN=1e5+5; struct node { int a[4][4]; void input() { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { scanf("%d",&a[i][j]); } } } void trans() { for(int i=0;i<4;i++) { for(int j=i+1;j<4;j++) { swap(a[i][j],a[j][i]); } } } }sv[MAXN]; int n,ans=0; int l[MAXN],r[MAXN]; void solve() { for(int i=0;i<4;i++) { int tot=0;//4 int sum=0,mxl=0,mxr=0; memset(l,0,sizeof(l)); memset(r,0,sizeof(r)); for(int k=1;k<=n;k++) { for(int j=0;j<4;j++) { if(sv[k].a[i][j]) l[k]++; else break; } for(int j=3;j>=0;j--) { if(sv[k].a[i][j]) r[k]++; else break; } int cnt=0; for(int j=0;j<4;j++) { if(sv[k].a[i][j]) cnt++; else cnt=0; ans=max(cnt,ans); } if(l[k]==4) tot++; } for(int k=1;k<=n;k++) { if(l[k]==4) continue; sum=max(sum,max(mxl+r[k],mxr+l[k])); mxl=max(mxl,l[k]);mxr=max(mxr,r[k]); } ans=max(ans,tot*4+sum); } } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) sv[i].input(); solve(); for(int i=1;i<=n;i++) sv[i].trans(); solve(); printf("%d\n",ans); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 152ms, 内存消耗: 604K, 提交时间: 2020-02-27 19:12:47
#include<bits/stdc++.h> using namespace std; int n,i,j,k,a[4][4],ans,s[8][16],o[16],o1[16],o2[16]; void fix(int x,int y) { s[x][y]++; } int main() { for(i=0;i<16;i++) for(i=0;i<16;i++) { o[i]=o[i>>1]; if(i&1) o[i]=max(o[i],o1[i]=o1[i>>1]+1); } for(i=0;i<16;i++) { for(j=3;~j;j--) if(!(i>>j&1)) break; o2[i]=3-j; } scanf("%d",&n); while(n--) { for(i=0;i<4;i++) for(j=0;j<4;j++) scanf("%d",a[i]+j); for(i=0;i<4;i++) { for(j=k=0;j<4;j++) k=k<<1|a[i][j]; fix(i,k); for(j=k=0;j<4;j++) k=k<<1|a[j][i]; fix(i+4,k); } } for(i=0;i<8;i++) for(ans=max(ans,4*s[i][15]),j=0;j<15;j++) if(s[i][j]) { ans=max(ans,max(o[j],max(o1[j],o2[j])+4*s[i][15])); for(k=0;k<15;k++) if(s[i][k]>(k==j)) ans=max(ans,o1[j]+o2[k]+4*s[i][15]); } cout<<ans<<endl; return 0; }