首页 > 编程语言 >P1037 [NOIP2002 普及组] 产生数 python 题解

P1037 [NOIP2002 普及组] 产生数 python 题解

时间:2024-03-28 19:31:30浏览次数:33  
标签:遍历 NOIP2002 nums 题解 P1037 dfs vis length ans

原题链接:产生数

原理解释

本题就是基本的dfs,对每一个数遍历深搜,得到他能变化的所有情况,最后相乘就是结果,网上都是c的解法,需要用到高精度,但是python可以处理大数,不需要。

vis[]判断该数是否变换过,防止重复

以 n=123 ,k=2,变换列表x=[1,3] ,y=[3,4] ,即1->3 ,3->4:

先遍历1:遍历整个x y, vis[y[i]] != 0 and x[i]==1 代表1可以变成y[i],就是3

​ 然后继续,4没有遍历过,且x[i]==3 所以3变成4,遍历完,退出。

​ 变换了2次,加上自身就是一种就是3次。

更新vis

在遍历2: 遍历x ,y. 没有x[i]==2,退出

更新vis

遍历3: 1->3 不匹配,下一个 ,3->4, x[i]==3,且vis[4]没有使用过,加一,然后退出,加上自身就是一种就是2次。

最后结果就是2*3=6次,次数用t保存即可

AC代码:

def dfs(e):
    global ans
    for i in range(1, k + 1):
        if not vis[y[i]] and x[i] == e:
            ans += 1
            vis[y[i]] = 1
            dfs(y[i])


nums, k = input().split()
k = int(k)
nums = list(nums)
length = len(nums)
x, y = [0], [0]
for _ in range(k):
    a, b = map(int, input().split())
    x.append(a)
    y.append(b)

t = [0] * (length + 1)
for i in range(length):
    ans = 0
    c = ord(nums[i]) - ord('0')
    nums[i] = c
    vis = [0] * 20
    vis[c] = 1
    dfs(c)
    t[i] = ans + 1
ans = 1
for x in t:
    if x != 0:
        ans *= x
print(ans)

标签:遍历,NOIP2002,nums,题解,P1037,dfs,vis,length,ans
From: https://blog.csdn.net/2201_75325396/article/details/137073460

相关文章

  • CF1392H ZS Shuffles Cards 题解
    题目传送门前置知识概率DP解法设\(f_{i}\)表示有\(i\)张数字牌没进入\(S\),即\(S\)中只有\(n-i\)张数字牌时的期望轮数,有\(f_{i}=\frac{i}{i+m}f_{i-1}+\frac{m}{i+m}(f_{i}+1)\),解得\(f_{i}=f_{i-1}+\frac{m}{i}\),边界为\(f_{0}=1\)。由于每一张数字牌在joke......
  • 20240328每日一题题解
    20240328每日一题题解摘要本文对于2024年3月28日的每日一题进行了问题重述,并将问题拆解为五个步骤,分别进行了详细的讨论与求解,实现了整型与字符串类型的互相转换。并且还指出,在编写C++程序时,需要观察数据范围,在有必要时使用长整型(longlong)存储数据,以免出现整型溢出现象。关键......
  • Spring Boot 工程开发常见问题解决方案,日常开发全覆盖
    本文是SpringBoot开发的干货集中营,涵盖了日常开发中遇到的诸多问题,通篇着重讲解如何快速解决问题,部分重点问题会讲解原理,以及为什么要这样做。便于大家快速处理实践中经常遇到的小问题,既方便自己也方便他人,老鸟和新手皆适合,值得收藏......
  • P2421-荒岛野人Savage题解
    好久没写题解了啊洛谷P2421荒岛野人题目大意:有一个有很多洞的岛上,住了\(n\)个野人,每个野人的初始位置为\(c[i]\),换洞的速度为\(p[i]\),寿命为\(l[i]\)。要求求出洞的最少个数\(M\)满足每个野人在生存状态下不会在同一年和其他野人住在同一个山洞里。概括版:很多个青蛙的约会。......
  • 【题解】AGC007E | 二分答案 复杂度分析
    首先考虑题目要求每条边被经过两次,这说明了我们进入一个子树后一定会处理完子树内所有的叶子后离开该子树,否则子树上端那条边会进出至少两次,即经过至少四次。所以这说明了子树之间的独立性:某个子树在答案中一定是一个连续的区间,这引导我们从有根树信息自下向上拼接的角度考虑。我......
  • SP2426 PLD - Palindromes 题解
    题目传送门题目大意给定一个字符串,请你求出这个字符串中所有长度为kkk的回文串的个数。解题思路我们只需要枚举每个字串的起始位置......
  • [USACO24FEB] Bessla Motors G 题解
    题目大意对于每个充电站找它所能去到的非充电站的点TTT($C<T$同时两点的距离在RR......
  • 2006 年考研英语真题 - 翻译题解析
    2006 年考研英语真题 - 翻译题解析IsittruethattheAmericanintellectualisrejectedandconsideredofnoaccountinhissociety?[1] 翻译:难道美国的知识分子被嫌弃,在社会中不受重视吗?1.it 是形式主语,代指后面的 that 从句。2.Americanintellectual 美......
  • 2007 年考研英语真题 - 翻译题解析
    2007 年考研英语真题 - 翻译题解析ThestudyoflawhasbeenrecognizedforcenturiesasabasicintellectualdisciplineinEuropeanuniversities.[1]                  翻译:几个世纪以来,欧洲的各所大学一直认为法学学习是一门基础知识学科。1.......
  • P5470 [NOI2019]序列 题解
    P5470:NOI2019序列题意:给定两个长度\(n\)的序列\(a,b\)。要求各选出\(k\)个数,使得这\(2k\)个数之和最大,且两个序列选出的数至少有\(l\)个位置相同。\(n\le2\times10^5\)。command_block的题解但是这个貌似有一些小问题,后文有写。算法:模拟费用流。【费用流模......