首页 > 其他分享 >[LOJ 6030]「雅礼集训 2017 Day1」矩阵 题解

[LOJ 6030]「雅礼集训 2017 Day1」矩阵 题解

时间:2023-07-03 20:57:29浏览次数:38  
标签:LOJ 题解 LL 全黑 Day1 最小化 填出 步数 贪心

首先不难想到一个贪心,就是先填出一个全黑的行,然后再用其填黑列。

而且在其中“填出一个全黑的行步数”我们应该最小化。

这个贪心的正确性证明如下:

必要性:填黑列的必要条件为有一个全黑的行。

充分性:“填黑列的步数”就是“非全黑列的数量”。

显然,如果填出一个全黑的行的过程中有列变成了全黑,那么这个行也是全黑,这与全黑行不存在矛盾。

进一步地,无论如何去生成一个全黑的行,“全黑列的数量”始终不改变,因此“填黑列的步数”不改变。

因此最小化答案就是最小化“填出一个全黑的行步数”。

综上所述,我们的贪心策略是最优的。

我们也可以扩展结论:

无解的情况当且仅当不存在黑点。

否则,这个黑点一定可以填出一个全黑行,策略是先覆盖其他所有列,再覆盖自身。

那么如何最小化“填出一个全黑的行步数”呢?我们发现关键所在是白点,我们可以进行操作填黑它。

我们设对应的操作为 \((x,y)\),白点为 \((a,y)\),则 \((x,a)\) 为黑。

  • 若存在 \((x,a)\) 为黑,则只需要一步。

  • 否则,我们先进行一个操作染黑 \((x,a)\),设操作为 \((b,a)\),则黑点为 \((b,x)\),此时,\((b,x)\)已经可以是任意黑点,而且我们只需要操作一次就可以染黑需要的\((x,a)\),所以是最优的。

到此,贪心就没有问题了。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL N=3005;
const LL inf=1e18;
LL n,a[N],b[N],cnt,mn=inf,hav[N],sum;
char c[N];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%s",c+1);//数据有误,请务必这样读入
		for(int j=1;j<=n;j++)
		{		
			if(c[j]=='#')a[i]++,b[j]++,sum++;
		}
	}
	if(sum==0)
	{
		puts("-1");
		return 0;
	}
	for(int i=1;i<=n;i++)
	{
		mn=min(mn,n-a[i]+(b[i]==0));
	}
	for(int i=1;i<=n;i++)
	{
		if(b[i]!=n)cnt++;
	}
	cout<<mn+cnt<<endl;
	return 0;
}

标签:LOJ,题解,LL,全黑,Day1,最小化,填出,步数,贪心
From: https://www.cnblogs.com/dengduck/p/17523997.html

相关文章

  • Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 问题解决
    以下是报错日志解决方案确认以下配置是否都存在:1、配置文件有写mybatis配置2、启动类里加上Mapper扫描的注解(指向自己mapper存放的位置)3、删除SpringBootApplication注解的exclude属性:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,DataSourc......
  • P2202 题解
    前言题目传送门!更好的阅读体验?提供一个平衡树做法,虽然和std::set一个道理就是了。(那你为啥不写set!!!!)前置知识如何判断两个点对应的正方形相交?正方形的边长是\(k\),中心距离四条边就是\(\dfrack2\)了。中心要相隔严格小于两段\(\dfrack2\),显然只需满足:\[|X_p-X_q|,|Y_......
  • 【CF1621G】Weighted Increasing Subsequences 题解(优化树状数组)
    CF传送门|LG传送门。优化树状数组+反向处理。Solution发现直接做不好下手。难点主要在求出所有的上升子序列并计算它们分别的贡献。所以需要反向考虑每个单点在什么情况下产生贡献。一个单点会产生多少贡献。一个单点产生贡献的条件很容易得到。一个是在一个上升子序......
  • 题解 ARC163C【Harmonic Mean】
    没想出来什么优美的解法,来个乱搞。特判平凡情况\(n\le2\),其中\(n=1\)显然有\(1=\frac{1}{1}\),\(n=2\)无解。众所周知\(1=\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+\cdots+\frac{1}{2^k}+\frac{1}{2^k}\)。注意到公式中除了\(\frac{1}{2^k}\)有重复外,其余项均无重复。容易......
  • day12
    day12函数高级课程目标:掌握函数嵌套、闭包、装饰器等高级知识点。今日概要:函数的嵌套闭包装饰器上述内容均属于函数部分必备知识,以后开发时直接和间接都会使用,请务必理解(重在理解,不要去死记硬背)。1.函数嵌套Python中以函数为作用域,在作用域中定义的相关数据只能被当......
  • day11
    day11函数进阶目标:掌握函数相关易错点&项目开发必备技能。今日概要:参数的补充函数名,函数名到底是什么?返回值和print,傻傻分不清楚。函数的作用域1.参数的补充在函数基础部分,我们掌握函数和参数基础知识,掌握这些其实完全就可以进行项目的开发。今天的补充的内容属于......
  • day14
    day14模块课程目标:掌握Python中常用模块的使用方法。今日概要:自定义模块(包)第三方模块内置模块【1/2】1.自定义模块1.1模块和包importhashlibdefencrypt(data):"""数据加密"""hash_object=hashlib.md5()hash_object.update(data.encode('utf......
  • AtCoder ABC307D 题解
    AtCoderABC307DMismatchedParentheses题解思路分析First——配对括号序列首先,每个右括号肯定是要与其左边最近的左括号配对。因此,我们便可以使用一个栈来进行存放左括号的下标。当有右括号时,便可以弹出栈顶元素,但是栈为空时,便无法配对。拿样例1举个例子:8a(b(d))c......
  • week2 day1
    今天:早上八点起来学车,进行科目三的学习从九点一直到下午四点,都在驾校耐受高温 下午回家洗了个澡,理了个发。理的有点短,还能说过去;因为头发短,染发计划推迟晚上打了个车回老家,如果不出去吃饭就在家学习一下Java敲一下ptaor出去吃饭,回来打游戏睡觉。明天将揭晓今晚干了什......
  • 洛谷 P1081 题解
    P1081[NOIP2012提高组]开车旅行题解Link洛谷题目链接Solution首先考虑这道题的暴力做法,对于第一问,枚举每个起始点,暴力计算每个点之后最近和第二近的位置,计算答案,最后取最大值。对于第二问,对每个询问独立模拟即可。复杂度较高,无法通过此题。第一个优化:考虑到对于固定的当......