BZOJ3517 翻硬币
原题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3517
翻硬币
Description
有一个n行n列的棋盘,每个格子上都有一个硬币,且n为偶数。每个硬币要么是正面朝上,要么是反面朝上。每次操作你可以选定一个格子(x,y),然后将第x行和第y列的所有硬币都翻面。求将所有硬币都变成同一个面最少需要的操作数。
Input
第一行包含一个正整数n。
接下来n行,每行包含一个长度为n的01字符串,表示棋盘上硬币的状态。
Output
仅包含一行,为最少需要的操作数。
Sample Input
4
0101
1000
0010
0101
Sample Output
2
HINT
【样例说明】
对(2,3)和(3,1)进行操作,最后全变成1。
【数据规模】
对于100%的数据,n ≤ 1,000。
题解
最暴力的思路当然是列n2n2n^2个异或方程组,然后高斯消元去接一个n2n2n^2个方程,nnn个未知数的方程组,大概是O(n4)" role="presentation" style="position: relative;">O(n4)O(n4)O(n^4)的。。。
我们不如拿个2×22×22\times 2的矩阵玩玩,设aaa是否翻转为a" role="presentation" style="position: relative;">aaa取值000或1" role="presentation" style="position: relative;">111,aaa的目标状态为a′" role="presentation" style="position: relative;">a′a′a',b,c,db,c,db,c,d以此类推:
那么我们可以列出四个方程:
\left\{ \begin{array}\\ a\ xor\ b\ xor\ c=a'&&(1)\\ a\ xor\ b\ xor\ d=b'&&(2)\\ a\ xor\ d\ xor\ c=c'&&(3)\\ d\ xor\ b\ xor\ c=d'&&(4) \end{array}\right.
貌似这些式子有点奇妙??
我们把(1)(2)(3)(1)(2)(3)(1)(2)(3)式异或起来:
a=a'\ xor\ b'\ xor\ c'
震惊,其他未知数都被消掉了!!!其他的式子似乎也是如此,好像我们只需要将那某个点所在的一行一列的数全部异或起来,就能知道这个点是否需要反转。
推广一下:因为nnn是偶数,所以一定可以通过将2n−1" role="presentation" style="position: relative;">2n−12n−12n-1个方程异或起来得到上面的那种形状。
事情变得简单起来。
代码
#include<bits/stdc++.h>
#define val (sq[i][j]-'0')
using namespace std;
const int M=1e3+5;
int n;
bool x[M],y[M];
char sq[M][M];
void in()
{scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%s",sq[i]+1);for(int j=1;j<=n;++j)x[i]^=val,y[j]^=val;}
}
void ac()
{int ans=0;for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)ans+=x[i]^y[j]^val^1;printf("%d",min(n*n-ans,ans));
}
int main()
{in();ac();return 0;
}
BZOJ3517 翻硬币相关推荐
- 浅谈 翻硬币游戏【Nim博弈】
ACM博客_kuangbin 博弈-翻硬币游戏 hihoCoder 1172 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和B ...
- 试题 历届试题 翻硬币(贪心)
试题 历届试题 翻硬币 资源限制 时间限制:1.0s 内存限制:256.0MB Work hard,Play harder. 问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排 ...
- 蓝桥杯 - 翻硬币(贪心)
小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo ...
- 【DP】翻硬币(jzoj 3921)
翻硬币 jzoj 3921 题目大意: 给你一个长度为nnn的当前01串和目标01串,现在你要做mmm此操作,每次操作你要使kkk个不同的位取反,现在问你有多少种方法可以使当前01串变为目标01串 输 ...
- 牛客14355 翻硬币
链接:https://ac.nowcoder.com/acm/problem/14355 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 蓝桥杯历届试题----矩阵翻硬币
矩阵翻硬币 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵.随后,小明对每一个硬币分别进行一次 Q 操作.对第x行第y列的硬币进行 Q 操作的定义:将所有第 i*x 行,第 j*y 列的硬币进 ...
- 蓝桥杯练习系统历届试题 翻硬币
问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如 ...
- 蓝桥杯试题:矩阵翻硬币
矩阵翻硬币 这是蓝桥杯的一道练习题,题目如下: 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬币进行 Q 操作的定义:将所 ...
- HDU-3537 Mock Turtles型翻硬币游戏
题意:<=10^8不定个硬币,给你n<=100个正面朝上的硬币以及他们所在的位置,可任选1/2/3个硬币反转(不必连续),但要求翻的这1/2/3个硬币中的最右侧的一个是正面朝上的,问先手者 ...
- AcWing 1208. 翻硬币
1208. 翻硬币 题意: 给定一个初始字符串(只含*和o字符) 给定一个目标字符串(只含*和o字符) 翻转初始字符串,每次会同时翻转其相邻的两个字符 求初始字符串翻转到目标字符串的最小翻转次数 输入 ...
最新文章
- Ehcache 缓存
- 图系列|7篇动态时空图网络学习必读的顶会论文
- python as_Python with as的用法
- 【itext学习之路】--4.给pdf增加文本水印和图片水印
- mac mysql-share_mac下安装mysql
- 获取oracle 里的表名与字段
- Redis实战(七)
- Google云端语音识别app
- 第二部分 python基础 day10\11\12 运算符与基本数据类型
- 苹果电脑修改hosts文件方法介绍!mac的hosts文件位置在哪?
- oracle 数据分列,如何使用Excel把有规律地txt文本数据分列
- android手势密码csdn,Android简易手势密码开源库
- 在腾讯云开通短信验证服务并完成群发消息测试
- android bugly 错误分析,Android使用bugly捕捉异常
- EduCoder-Hive表DDL操作(一、二)答案-路漫漫远俢兮
- 爬虫(七)通过Selenium爬取网易云音乐评论
- java易宝在线支付及PaymentUtil.java下载
- onnx-modifier使用
- ERROR 1819 (HY000): Your password does not satisfy the current policy requirements的解决方法
- google AdSense广告不显示的原因
热门文章
- 使用Gotestwaf测试WAF检测能力
- 一台电脑安装多个Chrome
- sql语句的书写顺序和执行顺序(包括各种可能的指令)
- 让面试官赞扬的IO读取方法:大文件进行词频统计(单线程与多线程分别解决)利用Buffer流简单又快捷
- 拥塞控制,图文并茂(挺丰富,借鉴较多大佬的思想)
- 225.队列实现栈 (力扣leetcode) 博主可答疑该问题
- 20145231熊梓宏 《网络对抗》 实验6 信息搜集与漏洞扫描
- 单个H扩展到多个H时,机器学习的保证
- phonegap plugin.xml 示例
- Servlet接收JSP参数乱码问题解决办法