番禺知名网站建设公司电商网站建设内容规划
2026/4/6 12:55:31 网站建设 项目流程
番禺知名网站建设公司,电商网站建设内容规划,如何加快门户网站建设,做休闲会所网站制作https://ac.nowcoder.com/acm/contest/125083/D 题目分析#xff1a; 通过了解题意#xff0c;我们会想到#xff0c;就是求出一个集合的所有子集合的和#xff0c;放入到一个新的集合里面#xff0c;然后求最多删除多少个数#xff0c;不会影响整体的 MEX MEX的介绍通过了解题意我们会想到就是求出一个集合的所有子集合的和放入到一个新的集合里面然后求最多删除多少个数不会影响整体的 MEXMEX的介绍mex指的是集合中未出现的最小 非负整数举个例子{ 1 3 5 7}那这个MEX就是2了ok我们最开始会想到就常规思路先求出所有的子集合的和然后其去求这个MEXMEX的求法我们知道了mex的 定义不难想到为了方便我们可以先把新的集合进行排序从小到大一般排序不影响做题的话我们还是先排序一下我们可以清晰的发现排完序的好处比如{1 3 5 6 8 }这个新集合来说我们如何找到MEX并且删除多余的元素很明显知道a[i]后倘若a[i]1a[i1]的话此时后面的值便可以全部删掉了但此题的关键是我们不能全部的求出所有的字集合因为我们会发现还真表示不出来直接枚举是不可能的正确的解法“排序求前缀和”高效处理所有的 子序列和的生成情况他虽然不能完整的求出所有的子序列和的完整集合但能精准的告诉你从0开始的连续一段区间哪些数字一定能被生成也就是我们要对最开始的集合先进行排序举个例子{1 5 7 3 9}排完序是{1 3 5 7 9}我们求前缀和 刚开始是1后面是4我们上面说的意思是我们虽然求不出完整的子序列和但我们求的前缀和比如上面的4他是保证前面1 2 3是存在显而易见是连续的那么这样的话如果要求MEX的话我们是不是就能判断出来如果前缀和我用sum表示sum1a[i1]的话是不是就可以把后面的值全部删掉就可以了也就求出我们想要的结果了我们可能到这里就不能理解为什么上面的 就是正确的接下来我就给说一下自己的理解 但也不一定对可能还是理解不懂这个大家也可以找找ai问问为什么正确假设我们这个集合是{1 3 5 7 9}和上面一样记住前提是排好序的那么我们的子序列有哪些呢单个的两个的相加三个的相加四个的相加五个的相加那么我们排完序后开始求前缀和的话也是和上面的步骤一样但我们排完序后的元素是从小到大的所以在执行上面的步骤时我们的所有数都是要比上面的小的 我们要知道最后得到的 新集合他也是要排序的从小到大而按照我们的 方法他每一步都会是最小的因为我们排序了从小到大所以不管是单个的还是几个的相加它都是最小的这个大家应该可以理解明白所以我们能证明在算法的每一步我们能保证小于sum的所有非负整数是都能够生成的所以如果我们的sum1a[i1]的话则说明a[i1]确实无法被所有的子序列和生成的继续我们此前加入的k个数从头到尾能生成的就是0sum如果我们在加的话按道理就是0k,sumk但我们的sumksum1,也就不满足题意了就是可以把后面的全部删掉了所以根据这个数学归纳法我们可以假设我们最开始集合就一个数然后一个一个的往里面加当然是从小到大我们是把已有的集合从小到大排列然后一个一个加进去的所以也就验证了我们这样做的正确性小结如果大家不想纠结于为什么这个算法是正确的大家只需要明白我上面写正确的解法中红字的部分即可初步代码这段代码其实还是有问题的也就是我们少判断了特例也就是集合中出现0的情况这里我们要明白一个问题0这个元素是必须能和删掉的所以我们在a[i]时我们要先判断输入0的次数用一个变量统计一下也就是最后进入到a[]里面的 一定是全部都是正数的才可以最后算个数的时候再把0的个数给加上就可以了大家可以想一下我例举下情况{0 0 0 1 3 }这个MEX是2如果删了0不影响{0 0 0 3 5 6}这种情况MEX是4删了0也不影响但如果我们把0放在我们的集合里面我们可能会提前终止我们的结果最后让结果偏小这个大家应该可以理解所以这个改动其实挺简单的 就是判断下这个0的个数把0给单独拿出来就行最后让a[]里面的全是正数即可正确的代码这道题到这里就结束了有点难度大家多练多想也真的欢迎有更多想法可以交流交流

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询