#6030. 【雅礼集训 2017 Day1】矩阵

#6030. 「雅礼集训 2017 Day1」矩阵

题目描述

有一个 n×n  的矩阵,每个位置 (i,j) 如果是 . 表示为白色,如果是 # 表示为黑色。

初始时,每个位置可以是黑色或白色的,(i,j)  位置的值会作为 ai,j 给你。

现在有一种操作,选择两个整数 i,j∈[1,n],记 (i,1),(i,2),…,(i,n) (i, 1), (i, 2)的颜色为 C1,C2,…Cn ??,将 (1,j),(2,j),…,(n,j)  的颜色赋为 C1,C2,…,Cn ??。

你的任务是将整个矩阵变成全黑,如果能够办到,输出最少步数,否则输出 −1。

输入格式

第一行一个整数 n nn。 接下来 n nn 行,每行 n nn 个字符表示整个矩阵。

输出格式

输出只有一行,一个整数表示答案。

样例

样例输入 1

2
#.
.#

样例输出 1

3

样例输入 2

2
..
..

样例输出 2

-1

数据范围与提示

对于 30% 的数据,n≤4 
对于另外 20%的数据,满足每一列都至少有一个黑色的格子;
对于 100% 的数据,1≤n≤1000

很巧妙地思路  应该是贪心吧。。

首先我们模拟一下可以发现

想要把整张图涂黑  一定是先涂黑一行之后  再涂整张图

涂黑一列的代价最小只能为1

那么我们可以想办法先用最少的步数涂黑一行

再用这一行去涂改其他列

涂改一行的最少步数 无非就是这一行的白点数

但是有一种特殊情况

像这样 (3,3) 这个位置不可能一次就涂成黑色

即你用的 第i行 对应的  第i列 没有一个黑点

这时候需要多加一步

先用第3行对第3列染色

然后再用 第1行 或 第2行 把(3,3)这个位置涂黑

无论是 第1行 还是 第2行 (3,1)和(3,2) 一定会又变成白色 这不影响我们的程序

因为中间那一步一定会被后来的一步给覆盖

这就是特殊情况多加一步

之后统计还有多少列 存在白点 用全黑的一行涂改就好了

 1 #include <cstdio>
 2 #include <cctype>
 3
 4 const int MAXN=1010;
 5
 6 int n;
 7
 8 char s[MAXN];
 9
10 int map[MAXN][MAXN],h[MAXN],l[MAXN];
11
12 bool flag;
13
14 inline void read(int&x) {
15     int f=1;register char c=getchar();
16     for(x=0;!isdigit(c);c==‘-‘&&(f=-1),c=getchar());
17     for(;isdigit(c);x=x*10+c-48,c=getchar());
18     x=x*f;
19 }
20
21 inline int min(int a,int b) {return a<b?a:b;}
22
23 inline void running() {
24     int ans=0x3f3f3f3f;
25     for(int i=1;i<=n;++i)
26       ans=min(ans,n-h[i]+(l[i]==0));//用最少的步数将一行转化成黑色
27     for(int i=1;i<=n;++i)
28       if(l[i]!=n) ++ans;//还有哪列没有涂黑
29     printf("%d\n",ans);
30     return;
31 }
32
33 int hh() {
34     read(n);
35     for(int i=1;i<=n;++i) {
36         scanf("%s",s+1);
37         for(int j=1;j<=n;++j)
38           if(s[j]==‘#‘) {
39               flag=true;
40               ++h[i];
41               ++l[j];
42           }
43     }
44     if(!flag) printf("-1\n");
45     else running();
46     return 0;
47 }
48
49 int sb=hh();
50 int main(int argc,char**argv) {;}

代码

时间: 2024-10-02 11:25:08

#6030. 【雅礼集训 2017 Day1】矩阵的相关文章

矩阵[雅礼集训 2017 Day1]

SOL 奇奇怪怪的贪心(你也不要问我为什么) #include<bits/stdc++.h> #define N 1007 int f[N][N],sum,ans,Ha,bo,n,Ans; #define MARICLE __attribute__((optimize("-O3"))) char ch,mp[N][N]; using namespace std; MARICLE void write(int x) {if (x<10) {putchar('0'+x);

loj6029 「雅礼集训 2017 Day1」市场

传送门:https://loj.ac/problem/6029 [题解] 考虑如果有一些近似连续的段 比如 2 2 2 3 3 3,考虑在除3意义下,变成0 0 0 1 1 1,相当于整体-2 又:区间增加很容易造成这种段,所以我们猜测可以暴力维护 用一棵线段树即可.(好像真的能暴力维护啊 我不知道怎么证明复杂度) # include <stdio.h> # include <string.h> # include <iostream> # include <al

【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析

题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之间,每次除的数在 $[2,10^9]$ 之间. 题解 线段树+均摊分析 和 [uoj#228]基础数据结构练习题 类似的均摊分析题. 对于原来的两个数 $a$ 和 $b$ ( $a>b$ ) ,原来的差是 $a-b$ ,都除以 $d$ 后的差是 $\frac{a-b}d$ ,相当于差也除了 $d$

「雅礼集训 2017 Day5」矩阵

填坑填坑.. 感谢wwt耐心讲解啊.. 如果要看这篇题解建议从上往下读不要跳哦.. 30pts 把$A$和$C$看成$n$个$n$维向量,那$A_i$是否加入到$C_j$中就可以用$B_{i,j}$表示了 枚举矩阵$A$,求出它的秩$r$,如果$C$在$A$的线性空间内则$C$可以被$A$表示出来 那么$B$矩阵的方案数就是$(2^{n-r})^n$ 这时候我们可以发现,由于枚举$A$覆盖了所有情况,秩相同的$C$的答案都是一样的 然后就可以打表算答案了.. 60pts 如果不想看可以跳过这段

「6月雅礼集训 2017 Day10」quote

[题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. $1 \leq T \leq 10^5, 1 \leq n \leq 10^7, 1\leq K \leq 10^9$ [题解] 显然引号序列可以看做括号序列,于是我们有了一个$O(n^2)$的dp了. 设$f_{i,j}$表示到第$i$个位置,前面有$j$个左引号没有匹配,的方案数 每次,要么有

「6月雅礼集训 2017 Day7」电报

[题目大意] 有n个岛屿,第i个岛屿有有向发射站到第$p_i$个岛屿,改变到任意其他岛屿需要花费$c_i$的代价,求使得所有岛屿直接或间接联通的最小代价. $1 \leq n \leq 10^5, 1 \leq p_i,c_i \leq 10^9$ [题解] 显然最后是个大环,特判原来就是大环的情况. 考虑每个连通块最多保留多少. 树的答案可以直接dp做出来. 环的答案,根据树的答案dp出来. h[x][0/1]表示当前做到环上第i个点,环是否被切断了,的最大保留价值. 因为环必须被切断一次.所

「6月雅礼集训 2017 Day8」gcd

[题目大意] 定义times(a, b)表示用辗转相除计算a和b的最大公约数所需步骤. 那么有: 1. times(a, b) = times(b, a) 2. times(a, 0) = 0 3. times(a, b) = times(b, a mod b) + 1 对于$1 \leq x \leq A, 1 \leq y \leq B$,求times(A, B)的最大值,以及有多少对数取到了最大值. 多组数据. $T \leq 3 \times 10^5, 1 \leq A,B \leq

「6月雅礼集训 2017 Day7」三明治

[题目大意] $1 \leq n,m \leq 400$ N字形表示:上图第1行第1个那种:Z字形表示上图第1行第2个那种. [题解] 很容易得到结论: 考虑如果紫色比绿色先消去,那么黄色一定会比对应的白色先消去(这样才能消去白色). 然后我们可以知道,设取走$(x, y)$靠左的正方形,要$L(x,y)$步,那么$L(x,y) \geq L(x,y-1)$,同理也有$L(x, y) \geq L(x, y+1)$. 然后我们对于这个就可以进行一行一行的dfs了,dfs的时候可能会搜到原来已经搜

「6月雅礼集训 2017 Day5」吃干饭

[题目大意] 询问[L,R]中选若干个数异或起来得到的答案集合大小.多组数据. 对于50%的数据,$R - L \leq 10^4$ 对于100%的数据,$R - L \leq 10^{18}, T \leq 10^2$ [题解] 考虑50%的数据,暴力线性基即可. 这样的复杂度是$O(T(R-L)logn)$ 观察到数据比较特殊,是连续的一段正整数,我们写完线性基暴力然后打个表观察数在什么时候被插入到线性基里. 我们以[23333, 66666]为例: 首先L=23333,这个数一定被插入到线