题目链接:https://www.nowcoder.com/acm/contest/211/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
示例2
输入
1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
输出
0
示例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
备注:
对于前30%,保证n<=1e3.( 然而并没卵用 )
对于前100%的数据,保证n<=1e5.
乱搞是没有活路的,出题人在验题时已经卡掉9种奇奇怪怪的dp和贪心了。
包括但不限于区间dp,O(n)的错误dp,模拟退火算法,爬山算法,遗传算法等.
而且出题人特别卡掉了快读。
ps:10%的数据保证随机。

题解:

对四行四列分别统计,每一行(列)下的每一个矩阵都有三种情况:

  1、四个 $1$ 全满;这个直接计数为 $fullcnt$。

  2、不是四个 $1$,但是左起(上起)或者右起(下起)能至少有一个 $1$;左起(上起)的放一起统计,右起(下起)的放一起统计。

  3、两侧都是 $0$,那么此时只有中间一个或者两个 $1$,这个再单独统计。

那么,对于某一行(某一列),他能产生的最长连续 $1$ 的长度为:

  1、四个 $1$ 全满的计数 $fullcnt$ 产生贡献 $4 \times fullcnt$。

  2、左起(上起)中最长的,加上,右起(下起)中最长的,即产生的贡献(当然,如果两个最长的同属于一个矩阵,则要考虑在“左起最长+右起次长”和“右起最长+左起次长”中挑一个)。

  3、两侧都是 $0$,显然上面两种情况的贡献就均为 $0$,而本情况能产生 $2$ 或 $3$ 的贡献。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+; int n;
struct Mat
{
int mp[][];
int cnt[][][];
void input()
{
for(int i=;i<=;i++) for(int j=;j<=;j++) scanf("%d",&mp[i][j]);
for(int i=;i<=;i++)
{
cnt[][i][]=;
for(int j=;j<=;j++)
{
if(mp[i][j]) cnt[][i][]++;
else break;
}//printf("第%d行左边起%d\n",i,cnt[0][i][0]);
cnt[][i][]=;
for(int j=;j>=;j--)
{
if(mp[i][j]) cnt[][i][]++;
else break;
}//printf("第%d行右边起%d\n",i,cnt[0][i][1]);
}
for(int j=;j<=;j++)
{
cnt[][j][]=;
for(int i=;i<=;i++)
{
if(mp[i][j]) cnt[][j][]++;
else break;
}//printf("第%d列上边起%d\n",j,cnt[1][j][0]);
cnt[][j][]=;
for(int i=;i>=;i--)
{
if(mp[i][j]) cnt[][j][]++;
else break;
}//printf("第%d列下边起%d\n",j,cnt[1][j][1]);
}
}
}mat[maxn]; struct Node
{
int val;
int id;
bool operator<(const Node& oth)const{return val>oth.val;}
Node(int _val,int _id){val=_val;id=_id;}
};
vector<Node> v[][][],u[][];
int fullcnt[][]={}; int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
mat[i].input();
for(int rc=;rc<=;rc++)
{
for(int k=;k<=;k++)
{
if(mat[i].cnt[rc][k][]== || mat[i].cnt[rc][k][]==) //全满,type=2
fullcnt[rc][k]++;
else if(mat[i].cnt[rc][k][]>) //左侧或上侧,type=3
v[rc][k][].push_back(Node(mat[i].cnt[rc][k][],i));
else if(mat[i].cnt[rc][k][]>) //右侧或下侧,type=1
v[rc][k][].push_back(Node(mat[i].cnt[rc][k][],i));
else //只存在于内部,type=4
{
int num=(!rc)?(mat[i].mp[k][]+mat[i].mp[k][]):(mat[i].mp[][k]+mat[i].mp[][k]);
u[rc][k].push_back(Node(num,i));
}
}
}
}
int ans=;
for(int rc=;rc<=;rc++)
{
for(int k=;k<=;k++)
{
sort(v[rc][k][].begin(),v[rc][k][].end());
sort(v[rc][k][].begin(),v[rc][k][].end());
int res;
if(v[rc][k][].size() && v[rc][k][].size())
{
Node& m1=v[rc][k][][],m2=v[rc][k][][];
Node& n1=v[rc][k][][],n2=v[rc][k][][];
res=(m1.id!=n1.id)?(m1.val+n1.val):max(m1.val+n2.val,m2.val+n1.val);
}
else if(v[rc][k][].size() || v[rc][k][].size())
{
if(v[rc][k][].size()) res=v[rc][k][][].val;
else res=v[rc][k][][].val;
}
else
{
if(u[rc][k].size())
{
sort(u[rc][k].begin(),u[rc][k].end());
res=u[rc][k][].val;
}
else res=;
}
ans=max(ans,*fullcnt[rc][k]+res);
}
}
cout<<ans<<endl;
}

给一些测试数据:






nowcoder 211B - 列队 - [(伪·良心贪心)真·毒瘤暴力]的更多相关文章

  1. 重读《深入理解Java虚拟机》六、Java泛型 VS C#泛型 (伪泛型 VS 真泛型)

    一.泛型的本质 泛型是参数化类型的应用,操作的数据类型不限定于特定类型,可以根据实际需要设置不同的数据类型,以实现代码复用. 二.Java泛型 Java 泛型是Java1.5新增的特性,JVM并不支持 ...

  2. 洛谷P1095守望者的逃离题解-伪动态规划/贪心

    链接 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很 ...

  3. ES6 伪数组转真数组

    更新日志 2022年6月13日 发布. 2022年5月19日 笔记迁移到博客. 直接上代码 [...a];

  4. POJ 2718 Smallest Difference(贪心 or next_permutation暴力枚举)

    Smallest Difference Description Given a number of distinct decimal digits, you can form one integer ...

  5. luogu P2354 [NOI2014]随机数生成器 贪心 卡空间 暴力

    LINK:随机数生成器 观察数据范围还是可以把矩阵给生成出来的. 考虑如何求出答案.题目要求把选出的数字从小到大排序后字典序尽可能的小 实际上这个类似于Mex的问题. 所以要从大到小选数字 考虑选择一 ...

  6. [bzoj1634][Usaco2007 Jan]Protecting the Flowers 护花_贪心

    Protecting the Flowers 护花 bzoj-1634 Usaco-2007 Jan 题目大意:n头牛,每头牛有两个参数t和atk.表示弄走这头牛需要2*t秒,这头牛每秒会啃食atk朵 ...

  7. 『数组的最大代价 贪心优化DP』

    数组的最大代价(51nod 1270) Description 数组A包含N个元素A1, A2......AN.数组B包含N个元素B1, B2......BN.并且数组A中的每一个元素Ai,都满足1 ...

  8. 【CF981D】Bookshelves(贪心,动态规划)

    [CF981D]Bookshelves(贪心,动态规划) 题面 洛谷 Codeforces 给定一个长度为\(n\)的数列,把他们划分成\(k\)段,使得每段的和的结构按位与起来最大. 题解 从高位往 ...

  9. 【DFS】【贪心】Codeforces Round #411 (Div. 1) C. Ice cream coloring

    对那个树进行dfs,在动态维护那个当前的冰激凌集合的时候,显然某种冰激凌仅会进出集合各一次(因为在树上形成连通块). 于是显然可以对当前的冰激凌集合贪心染色.暴力去维护即可.具体实现看代码.map不必 ...

随机推荐

  1. MongoDB中MapReduce介绍与使用

    一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...

  2. MYSQL 中query_cache_size小结

    1 原理    MySQL查询缓存保存查询返回的完整结果.当查询命中该缓存,会立刻返回结果,跳过了解析,优化和执行阶段. 查询缓存会跟踪查询中涉及的每个表,如果这写表发生变化,那么和这个表相关的所有缓 ...

  3. 基于CentOS搭建基于 ZIPKIN 的数据追踪系统

    系统要求:CentOS 7.2 64 位操作系统 配置 Java 环境 安装 JDK Zipkin 使用 Java8 -openjdk* -y 安装完成后,查看是否安装成功: java -versio ...

  4. [Aaronyang紫色博客] 写给自己的WPF4.5-Blend5公开课系列 1

     我的文章一定要做到对读者负责,否则就是失败的文章  ---------   www.ayjs.net    aaronyang技术分享 欢迎大家支持我的力作<[Aaronyang] 写给自己的 ...

  5. Spark2.3 HA集群的分布式安装

    一.下载Spark安装包 1.从官网下载 http://spark.apache.org/downloads.html 2.从微软的镜像站下载 http://mirrors.hust.edu.cn/a ...

  6. 使用jmeter往指定文件中插入一定数量的数据

    有一个需求,新建一批账号,把获取的账号相关信息存入文本文件,当文本文件保存的数据达到一定的数量,就自动停止新建账号. 分析下需求: 1.把账号信息保存到文件,需要使用bean shell脚本(bean ...

  7. ES6,扩展运算符的用途

    ES6的扩展运算符可以说是非常使用的,在给多参数函数传参,替代Apply,合并数组,和解构配合进行赋值方面提供了很好的便利性. 扩展运算符就是三个点“...”,就是将实现了Iterator 接口的对象 ...

  8. 扩展layui中的自带字体图标

    项目中,虽然layui的字体图标库中已经有了1000多个图标了,但是也有时候不能满足我们自定义图标的需求,所以需要进行自定义,具体步骤如下: 1.在iconfont上找到自己喜欢的图标,也可以上传ui ...

  9. CLOS网络架构与FATTREE胖树拓扑

    FatTree拓扑结构是由MIT的Fares等人在改进传统树形结构性能的基础上提出的,属于switch-only型拓扑. 整个拓扑网络分为三个层次:自上而下分别为边缘层(edge).汇聚层(aggre ...

  10. 可能是最早的学习Android N新特性的文章

    可能是最早的学习Android N新特性的文章 Google在今天放出了Android N开发者预览版.Android N支持Nexus6及以上的设备.5太子Nexus5不再得到更新. Android ...