【枚举】AcWing 116. 飞行员兄弟 数学解法正确性证明

本文介绍了一种策略,通过最少的操作次数调整一个4x4冰箱把手矩阵,确保所有把手打开。策略基于奇偶性规则,通过计算和选择关键把手来实现。解决方案包括代码实现和步骤分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有 16 个把手的冰箱。

已知每个把手可以处于以下两种状态之一:打开或关闭。

只有当所有把手都打开时,冰箱才会打开。

把手可以表示为一个 4×4 的矩阵,您可以改变任何一个位置 [i,j] 上把手的状态。

但是,这也会使得第 i 行和第 j 列上的所有把手的状态也随着改变。

请你求出打开冰箱所需的切换把手的次数最小值是多少。

输入格式

输入一共包含四行,每行包含四个把手的初始状态。

符号 + 表示把手处于闭合状态,而符号 - 表示把手处于打开状态。

至少一个手柄的初始状态是关闭的。

输出格式

第一行输出一个整数 N,表示所需的最小切换把手次数。

接下来 N 行描述切换顺序,每行输出两个整数,代表被切换状态的把手的行号和列号,数字之间用空格隔开。

注意:如果存在多种打开冰箱的方式,则按照优先级整体从上到下,同行从左到右打开。

数据范围

1≤i,j≤41≤i,j≤41i,j4

输入样例:

-+--
----
----
-+--

输出样例:

6
1 1
1 3
1 4
4 1
4 3
4 4

Solucioˊn del problema\mathrm{Solución\ del\ problema}Solucioˊn del problema

证明:当 (i,j)(i,j)(i,j) 改变时能够同时改变的 777 个点中关闭的锁的个数为奇数的时候,改变 (i,j)(i,j)(i,j) ,否则不变。

由题意可以知道,闭合的锁需要被改变奇数次,打开的锁只需要被改变偶数次。

考虑 (i,j)(i,j)(i,j) 所管辖的 777 个锁:

  • 若关闭的锁的个数为奇数,则 777 个锁共需被改变奇数次
  • 若关闭的锁的个数为偶数,则 777 个锁共需被改变偶数次

再考虑改变除 (i,j)(i,j)(i,j) 外的另外一个点 (x,y)(x,y)(x,y)

  • (x,y)(x,y)(x,y) 在第 iii 行或第 jjj 列,777 个锁的总改变次数增加 444 ,奇偶性不变
  • 否则,将改变 (x,j)(x,j)(x,j)(i,y)(i,y)(i,y) 两个锁,奇偶性也不变

因此,改变除 (i,j)(i,j)(i,j) 外的锁都不会使 (i,j)(i, j)(i,j) 管辖的 777 个点的改变次数的奇偶性发生变化。

所以,要想使得 777 个点的改变次数由偶数次(未改变)变为奇数次,必须改变 (i,j)(i,j)(i,j)

若将此证明推广至 N∗NN*NNN 的矩阵,则当 NNN 为奇数时,不存在加粗部分的性质,

因此只有在 NNN 为偶数时成立。


Coˊdigo\mathrm{Código}Coˊdigo

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

bool mp[6][6];
int cnt;
pair<int, int> pos[20];

int main()
{
	for(register int i = 1; i <= 4; i ++ )
	{
		char str[6];
		scanf("%s", str + 1);
		for(register int j = 1; j <= 4; j ++ )
			mp[i][j] = (str[j] == '-' ? 0 : 1);
	}
	for(register int i = 1; i <= 4; i ++ )
		for(register int j = 1; j <= 4; j ++ )
		{
			int sum = -mp[i][j];
			for(register int k = 1; k <= 4; k ++ ) sum += mp[k][j];
			for(register int k = 1; k <= 4; k ++ ) sum += mp[i][k];
			if(sum & 1) pos[++cnt] = {i, j};
		}
	printf("%d\n", cnt);
	for(register int i = 1; i <= cnt; i ++ ) printf("%d %d\n", pos[i].first, pos[i].second);
	return 0; 
} 
3689 - 星际穿梭 题目描述 为了快速在宇宙中穿梭,人类研发了一款能够瞬间加速的宇宙飞船。 这款飞船起步时可以任意选择速度 a 千米每秒,a 必须为正整数。 另外此飞船的发动机有一个长度为 m 的加速参数序列 b1、b2、...、bm,起步后第 i 秒 可以根据发动机参数 bi 来调整飞船速度,使其至少增加 2 倍、至多增加 bi 倍;如 bi=3,则 可以选择加速 2 倍或 3 倍。 特别的,若 i 大于 m,那么加速参考 bm,即速度至少增加 2 倍、至多增加 bm 倍。如 加速参数只有两条 b1,b2,则第三秒时加速参考 b2。增加的速度必须为原本速度的整数倍。 飞船改变速度后的 1 秒内,飞船都会按此速度飞行。 你是其中一艘宇宙飞船的驾驶员,现在你需要执行飞行任务,经过 n 个排成一条直线的 空间站,第 i 个空间站在起点前方距离 ci 千米。如果飞船正好在整数秒抵达空间站,那么这 个空间站的信息可以被飞船获得。你需要计算在获得所有空间站信息的基础上,飞行时间如 何尽可能的短,输出这个最短飞行时间秒数。如果不能获取所有空间站信息,请输出-1. 输入 共四行 第一行一个整数 m,代表飞船的发动机参数序列长度; 第二行 m 个整数 b1、b2、...、bm,代表飞船的发动机参数序列; 第三行一个整数 n,代表空间站数量; 第四行 n 个整数 c1、c2、...、cn,代表起点正前方空间站的距离。 输出 仅一个正整数,代表最短飞行时间秒数或者-1。 样例 输入复制 2 9 9 1 571 输出复制 5 说明 数据范围 对于 30%的数据,保证输入的 max{c1、c2、...、cn}<=30;其中数据 1,m=n=1; 对于 70%的数据,保证输入的 max{c1、c2、...、cn}<=100000; 对于 100%的数据,保证输入的 max{c1、c2、...、cn}<=10 9,n,m,max{b1、b2、...、bn}<=20。 样例解释 1 初始速度为 1km/s,0-1s 走了 1km;1s 时将速度调整 2 倍为 2km/s,1-2s 走了 2km;2s 时将速度调整 4 倍为 8km/s,2-3s 走了 8km;3s 时将速度调整 7 倍为 56km/s,3-4s 走了 56km; 4s 时将速度调整 9 倍为 504km/s,4-5s 走了 504km。5s 一共走了 1+2+8+56+504=571km。 来源 BCSP-X小高组编程能力样卷-T4 标签 BCSP-X 题目参数 时间限制 1 秒 内存限制 128 MB 提交次数 51 通过人数 0 金币数量 0 枚 难度 入门
最新发布
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值