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

这篇具有很好参考价值的文章主要介绍了[LOJ 6030]「雅礼集训 2017 Day1」矩阵 题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

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

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

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

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

我们也可以扩展结论:

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

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

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

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

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

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

到此,贪心就没有问题了。文章来源地址https://www.toymoban.com/news/detail-518370.html

#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 6030]「雅礼集训 2017 Day1」矩阵 题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法集训】基础数据结构:十、矩阵

    矩阵其实就是二维数组,这些题目在9日集训中已经做过,这里做的方法大致相同。

    2024年02月04日
    浏览(31)
  • 算法笔记day1小结

    最近在通过胡凡的算法笔记一书学习算法,准备开个帖子记录下每日学习进展,话不多说那就开始吧! 定义:内存地址称为指针 , 指针变量即存储地址的变量。(虽然有点绕口,但可以理解为指针就是一个地址,对应着内存中的一个存储单元。unsigned类型的整数)。 指针的

    2024年02月19日
    浏览(41)
  • 数据结构与算法学习(day1)

    (1)我是一个大三的学生(准确来说应该是准大三,因为明天才报名哈哈哈)。 (2)最近就想每天闲着没事也刷些C语言习题来锻炼下编程水平,也一直在思考企业对应届大学生能力的要求,所以经常会想到关于面试的事情。由于我也没实习过,所以我对面试没有一个具象化

    2024年02月10日
    浏览(41)
  • 算法刷题Day1 二分查找+移除元素

    代码随想录-数组-1.数组理论基础 数组是存放在 连续内存空间 上的 相同类型 数据的 集合 优点:常数时间复杂度访问元素 缺点: 在删除或者增添元素的时候,就难免要移动其他元素的地址 ,时间复杂度为O(n) 代码随想录-数组-2.二分查找 前提条件 二分查找前提条件: 数组

    2024年02月10日
    浏览(42)
  • 代码随想录算法练习Day1:二分查找

    题目链接:704. 二分查找 卡哥视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找 二分法概述: 二分法(Binary Search)是一种在有序数组或列表中查找目标元素的算法。 二分法使用前提 : 有序数组或列表 :二分法要求在查找的数据结

    2024年04月23日
    浏览(32)
  • 【算法训练(day1)】李白打酒加强版(dp问题)

    目录 一.题目描述 输入格式 输出格式 输入输出样例 说明/提示 二.解题思路 定义状态 推导状态方程 细节处理  三.实现代码 四.小结一下 话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒 22 斗。他边走边唱: 无事街上走,提壶去

    2024年02月02日
    浏览(28)
  • 数据结构与算法学习(day1)——简化版桶排序

    (1)我是一个大三的学生(准确来说应该是准大三,因为明天才报名哈哈哈)。 (2)最近就想每天闲着没事也刷些C语言习题来锻炼下编程水平,也一直在思考企业对应届大学生能力的要求,所以经常会想到关于面试的事情。由于我也没实习过,所以我对面试没有一个具象化

    2024年02月09日
    浏览(31)
  • 【golang项目-GeeCache】动手写分布式缓存 day1 - 实现LRU算法

    【go项目-geecache】动手写分布式缓存 - day1 - 实现LRU算法 【go项目-geecache】动手写分布式缓存 - day2 - 单机并发缓存 【go项目-geecache】动手写分布式缓存 - day3 - HTTP 服务端 【go项目-geecache】动手写分布式缓存 - day4 - 一致性哈希(hash) 【go项目-geecache】动手写分布式缓存 - day5 - 分布

    2023年04月20日
    浏览(28)
  • 算法刷题营【Day1】:: 704.二分查找:二分法详谈与相关刷题

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:704. 二分查找 2. 题解参考(模板写法) - - 2.1 方法一:左闭右闭写法 - - 2.2 方法二:左闭右开写法 3. 模板解释:左闭右闭 - - 3.1 区间划定 - - 3.2 left 、right 移动问题 - - 3.3 循环条件

    2024年02月04日
    浏览(34)
  • 算法刷题营【Day1】:: 27. 移除元素:快慢指针在顺序表中的应用与相关刷题

    本内容是笔者结合《代码随想录》总结所得,记录学习过程,分享知识! 目录: 1. 开篇例题:27. 移除元素 2. 题解参考 3. 题解思路 4. 相关题 [ - - 4.1 26. 删除有序数组中的重复项 ] [ - - 4.1 283. 移动零 ] 5. 相关题题解及简要思路 - - 5.1 26. 删除有序数组中的重复项 - - 5.1 283. 移动

    2024年02月06日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包