牛客算法心得——kotori和素因子(dfs)

2023-11-30 03:12

本文主要是介绍牛客算法心得——kotori和素因子(dfs),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我是晴天学长,传智杯的题,一个经典的全排列找最小的问题,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪


1) .kotori和素因子

在这里插入图片描述
链接:https://ac.nowcoder.com/acm/problem/50042
来源:牛客网

输入
复制
4
12 15 28 22
输出
复制
17
说明
分别取3,5,7,2,可保证取出的数之和最小
示例2
输入
复制
5
4 5 6 7 8
输出
复制
-1


2) .算法思路

kotori和素因子
1.预处理2到1000的所有质数。
2.接收n个数据
3.st标记,一个数只能选一个素数

dfs(选数的位置)
1.出口,当所有数都选完了,输出结果。
2.开始选数。
3.如果没有可以选的素数了,返回-1.
4.递归到下一个选的数


3)算法步骤

1.读取输入的行并拆分为字符串数组。

2.解析数组的第一个元素为整数n,表示接下来要读取的数字个数。

3.读取下一行并将其拆分为字符串数组。

4.将字符串数组中的数字解析为整数,并存储在一个整数数组num中。

5.对num数组进行排序,以便后续处理。

6.调用get_primes方法预处理2到1000的质数,并返回质数的个数。

7.初始化一个布尔数组st,用于标记质数是否已使用。

8.调用dfs方法进行深度优先搜索,初始时传入初始参数。

9.在dfs方法中,如果搜索到叶子节点(index == length),更新最小值min。

10.对于当前数字num[index],遍历质数列表list。

11.如果当前质数list.get(i)未使用且可以整除num[index],则将该质数加入当前和sum,标记该质数为已使用,并递归调用dfs方法。

12.在递归调用dfs方法后,需要将当前质数从当前和sum中减去,并将其标记为未使用。

13.如果当前数字num[index]小于质数list.get(i),则直接返回。

14.在dfs方法结束后,如果最小值min仍然是初始值,则输出-1,否则输出最小值min。

15.实现get_primes方法,使用埃氏筛法预处理2到1000的质数,并将质数存储在列表list中。

16返回质数列表list的大小。


4). 代码实例

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static String[] lines;static List<Integer> list = new ArrayList<>();static boolean[] st;static int min = Integer.MAX_VALUE;public static void main(String[] args) throws IOException {lines = in.readLine().split(" ");int n = Integer.parseInt(lines[0]);lines = in.readLine().split(" ");int[] num = new int[n];for (int i = 0; i < n; i++) {num[i] = Integer.parseInt(lines[i]);}Arrays.sort(num);int lenth = get_primes(1000);st = new boolean[lenth];dfs(st, num, 0, 0, num.length);if (min == Integer.MAX_VALUE) System.out.println(-1);else System.out.println(min);}private static void dfs(boolean[] st, int[] num, int index, int sum, int length) {if (index == length) {min = Math.min(min, sum);return;}int temp = num[index];for (int i = 0; i < 168; i++) {if (!st[i] && temp % list.get(i) == 0) {sum += list.get(i);st[i] = true;dfs(st, num, index + 1, sum, length);st[i] = false;sum -= list.get(i);}if (temp < list.get(i)) return;}}//预处理2到1000的质数.(埃式筛)public static int get_primes(int n) {boolean[] visit = new boolean[n + 1];for (int i = 2; i <= n; i++) {if (!visit[i]) {list.add(i);}for (int j = i + i; j <= n; j += i) {visit[j] = true;}}return list.size();}
}

4).总结

  • 回溯的正常状态,一般来说,dfs上下两面都是相反的。

试题链接

这篇关于牛客算法心得——kotori和素因子(dfs)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第