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

相关文章

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

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

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

枚举相关知识点

1.是用户定义的数据类型,为一组相关的常量赋予有意义的名字。 2.enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误,在编译期间可检查错误。 3.enum定义的枚举类有什么特点。         a.定义的enum类型总是继承自java.lang.Enum,且不能被继承,因为enum被编译器编译为final修饰的类。         b.只能定义

二维旋转公式

二维旋转公式 ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。 1. 二维旋转公式(算法) 而(此文只针对二维)旋转则是表示某一坐标点 ( x