首页 > 其他分享 >费解的开关[二进制、递推]

费解的开关[二进制、递推]

时间:2022-10-05 00:22:52浏览次数:69  
标签:moy 第一行 修改 二进制 费解 int include 递推 getchar

题面

传送门[https://www.acwing.com/problem/content/description/97/]

分析

考虑逐行分析,以行递推
如果不再改变第一行,则满足题意的点击方案最多1种
理由是:如果第i行某一位为0,由于第i行固定,只能点击第i+1行这个位置才能将其改变为1,归纳可得
所以直接开始遍历
在固定第一行之前先对第一行进行修改(不能直接贪心不修改第一行)
修改的意义在于找出第一行有被点击的最优解
第一行5个元素的修改方案可以用五位二进制数表示
例如10110,其中1表示修改,0表示不修改,则0~31可表示第一行元素的修改方案

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
inline int read() {
	register int x = 0, f = 1;
	register char c = getchar();
	while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
	while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0',c = getchar();
	return x * f;
}
int n,ANS = 10;
const int MAXN = 6;
int mat[MAXN][MAXN],backup[MAXN][MAXN];//mat储存矩阵,backup备份初始矩阵 
int movex[5] = {0, -1, 0, 1, 0},movey[5] = {0, 0, -1, 0, 1};//每一对组合分别表示不动、左、下、右、上 

void change(int x,int y) {//修改五个位置的值 
	for (int i(0); i <= 4; i++){
		int mox = x + movex[i],moy = y + movey[i];
		if (mox < 1 || mox > 5 || moy < 1 || moy > 5) continue;//越过矩阵范围直接跳 
		mat[mox][moy] ^= 1;
	}
}

void init(){
	getchar();//读掉回车
	for (int i(1); i <= 5; i++){
		for (int j(1); j <= 5; j++){
			mat[i][j] = (getchar() - '0'); 
		}
		getchar();//结尾也要读掉回车
	}
}

void doit() {
	for (int i(0); i < 1 << 5; i++) {//枚举第一行修改方案
		int ans = 0;
		memcpy(backup, mat, sizeof(mat));
		for (int j(0); j <= 4; j++)
			if (i >> j & 1) {//位运算操作取出i中1的位置
				ans++;
				change(1, j + 1);
			}
		for (int j(1); j <= 4; j++)
			for (int k(1); k <= 5; k++)
				if (!mat[j][k]) {//暴力修改
					ans++;
					change(j + 1,k);
				}
		bool check = true;
		for (int j(1); j <= 5; j++)
			if (!mat[5][j]){//遍历最后一行是否全为1
				check = false;
				break;
			}
		if (check) ANS = min (ANS, ans);
		memcpy(mat, backup, sizeof(backup));
	}
	if (ANS > 6) puts("-1");
	else printf("%d\n",ANS);
	ANS = 7;//初始化大于6就行
}

int main() {
	cin >> n;
	while (n--){
		init();
		doit();
	}
	return 0;
}

标签:moy,第一行,修改,二进制,费解,int,include,递推,getchar
From: https://www.cnblogs.com/cancers/p/16754888.html

相关文章

  • 二进制安装meven、Nexus
    1、二进制安装mevenhttps://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz#清华大学下载地址https://dlcdn.ap......
  • 二进制和16进制互相转换
    privatestaticStringbyteToHex(byte[]bytes){StringBuilderhex=newStringBuilder();for(byteb:bytes){hex.append(HEX......
  • 【code基础】java 二进制和十进制互转
    十进制的int类型转变为字符串形式的二进制,如2->"10"Integer.toString(number,2);//十进制转换为二进制其中number为十进制的类型Integer.toBinaryString(number)//......
  • 二进制安装Zabbix
    1、选择zabbix版本官网地址:​​https://www.zabbix.com/​​2、安装仓库[root@rocky8~]#rpm-Uvhhttps://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0......
  • Windows上编译可运行在Linux上的go二进制文件
    Windows上编译可运行在Linux上的go二进制文件1、前言默认Windows上编译的go二进制为exe,只能运行在Windows上,而想要在Linux上运行,则需要到Linux的平台编译。有没有一种办......
  • 现代功率谱估计(2):Levinson-Durbin递推方法求解AR模型参数
    现代功率谱估计(2):Levinson-Durbin递推方法求解AR模型参数p阶AR模型的差分方程形式和系统函数分别为:令\(z=e^{jw}\),则AR模型输出的功率谱密度为:AR模型的系统输出信号......
  • 计算机基础、二进制转换
    硬件基础环境变量二进制转换......
  • 二进制部署k8s集群v1.23.9版本-21-安装LTS任务调度
    21.1、准备镜像192.168.1.200服务器操作lts-jobtracker镜像dockerpullharbor.qgutech.com/qx-apaas/lts-jobtracker:v1dockertag8f1e3d395515harbor.qgutech.com/......
  • ansible 二进制安装docker
     首先,上传文件docker-20.10.9.tgz到/data/docker/下 1、编辑docker.service文件docker的配置文件vim/data/docker/docker.service【[Unit]Description=DockerA......
  • ansible 二进制安装mysql
    1、编辑mysql.sh脚本vimmysql.sql【#/bin/bash#脚本安装mysql,上传安装包至/rootcd/root#安装日志mysql_log=/root/mysql.log#mysql安装包名mysql_package=mysql-8......