1443 拍照(枚举 + 推公式)

2023-10-09 21:30
文章标签 公式 枚举 拍照 1443

本文主要是介绍1443 拍照(枚举 + 推公式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 问题描述:

农夫约翰在给他编号为 1…N 的 N 头奶牛排队拍照。约翰一开始计划从左向右数第 i 个位置排编号为 ai 的奶牛,他在一张纸上写下了排列 a1,a2,…,aN。不幸的是,这张纸刚刚被小偷偷走了!幸好约翰仍然有机会恢复他之前写下的排列。在这张纸被偷走之前,奶牛贝茜记录了序列 b1,b2,…,bN−1,对于每一个 1 ≤ i < N 满足 bi = ai + ai+1。基于贝茜的信息,帮助约翰恢复可以产生序列 b 的"字典序最小"的排列 a。排列 x 字典序小于排列 y:如果对于某个 j,对于所有 i < j 均有 xi = yi,且有 xj < yj(换句话说,这两个排列到某个位置之前都相同,在这个位置上 x 小于 y)。保证存在至少一个满足条件的 a。

输入格式

输入的第一行包含一个整数 N。第二行包含 N−1 个空格分隔的整数 b1,b2,…,bN−1。

输出格式

输出一行,包含 N 个空格分隔的整数 a1,a2,…,aN。

数据范围

2 ≤ N ≤ 10 ^ 3

输入样例:

5
4 6 7 6

输出样例:

3 1 5 2 4
样例解释
a 能够产生 b,因为 3+1=4,1+5=6,5+2=7,2+4=6。
来源:https://www.acwing.com/problem/content/1445/

2. 思路分析:

对于这种存在公式的题目我们需要先推导一下,发现一下其中的规律,我们可以写出所有的等式可以发现当bi确定之后实际上是一个n个未知数和n - 1个方程的线性方程组,根据线性方程组的相关知识可以知道方程组存在无穷多解或者无解的情况,而题目中规定了至少存在一组解,所以肯定是有解的。n个未知数n-1个方程所以肯定存在一个自由变量,不妨设a1为自由变量所以当a1的值确定之后,那么a2~an的值也是确定的,所以我们可以枚举a1的所有可能取值,也即枚举1~n,通过下图中的公式递推出a2~an,因为题目中要求a1~an是一个排列所以在递推ai的过程中判断生成的ai是否符合要求,如果当n个元素ai都符合要求那么直接返回结果即可,因为第一次找到的满足要求的一定是字典序最小的。

3. 代码如下:

from typing import Listclass Solution:# 判断当前的a1推导出的其余ai是否是一个排列def check(self, a1: int, n: int, b: List[int]):# st用来标记对应的数字是否已经被使用过了st = [0] * (n + 10)a = [0] * (n + 10)a[1] = a1st[a1] = 1for i in range(2, n + 1):# 推导出其余的aia[i] = b[i - 1] - a[i - 1]# 越界了if a[i] < 0 or a[i] > n: return False# 存在重复if st[a[i]]: return Falsest[a[i]] = 1# 没有重复没有越界且总共有n个元素说明是一个排列输出排列for i in range(1, n + 1):print(a[i], end=" ")return True# 枚举 + 推公式def process(self):n = int(input())# b的前面加上一个0这样下标可以从1开始比较好处理b = [0] + list(map(int, input().split()))for i in range(1, n + 1):if self.check(i, n, b):breakif __name__ == "__main__":Solution().process()

这篇关于1443 拍照(枚举 + 推公式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175715

相关文章

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、

C#之枚举类型与随机数详解

《C#之枚举类型与随机数详解》文章讲解了枚举类型的定义与使用方法,包括在main外部声明枚举,用于表示游戏状态和周几状态,枚举值默认从0开始递增,也可手动设置初始值以生成随机数... 目录枚举类型1.定义枚举类型(main外)2.使用生成随机数总结枚举类型1.定义枚举类型(main外)enum 类型名字

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

利用Python实现添加或读取Excel公式

《利用Python实现添加或读取Excel公式》Excel公式是数据处理的核心工具,从简单的加减运算到复杂的逻辑判断,掌握基础语法是高效工作的起点,下面我们就来看看如何使用Python进行Excel公... 目录python Excel 库安装Python 在 Excel 中添加公式/函数Python 读取

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi