秋招突击——算法训练——8/1——用友集团笔试

文章目录

    • 引言
    • 正文
      • 小友的生产线
        • 个人实现
        • 参考实现
      • 小友策划游戏人物
        • 个人实现
        • 参考实现
      • 最佳工作任务安排
        • 个人实现
        • 参考实现
      • 大众评分最高的一次旅程
    • 总结

引言

  • 今天晚上七点钟到九点钟是用友集团的笔试,作为今天算法练习的主要内容!具体怎么样,晚上再说喽!

正文

小友的生产线

  • 小友设计了一条新的生产线,在该条生产线上共有0-n种工序。每种工序之间可能存在上下游关系,如果一种工序没有下游工序,则为终点工序。如果一种工序其所有可能下游工序均可到达终点工序,则称该工序为合规工序。

  • 给你一个有向图,其中有n个节点,表示不同种工序,以及不同工序之间的关系,请计算该条生产线中,所有的合规工序,并按照升序排列。

  • 注意:终点工序无下游工序,默认为合规工序。

输入描述

  • 第一行输入正整数n,表示共有n个工序节点;

  • 接下来n行,每行有j(1<=j<n)个数,表示工序节点i与其余j个工序节点上下游关系。

  • 注意:若工序节点i为终点工序,则j=1,且数值为-1

输出描述

  • 输出一个数组,用来表示所有的合规工序,并按照升序排列

补充说明

● n == graph.length
● 1 <= n <= 1040 <= n[i].length <= n
● -1 <= n[i][j] <= n - 1
● n[i] 按严格递增顺序排列
● 图中可能包含自环

示例 1

  • 输入
5
1 2 3 4
1 2
3 4
0 4
-1
  • 输出
4

说明

  • 只有工序4是终点工序,即为合规工序

示例 2

  • 输入
7
1 2
2 3
5
0
5
-1
-1
  • 输出
 2 4 5 6

说明

工序5和6为终点工序,即为合规工序 工序2和4开始的所有下游工序最终都指向终点工序,按照升序排列最终结果为2,4,5,6

个人实现
  • 这道题我是单纯使用回溯实现的,个人看来就是判定没有给节点的所有可能路径,是否可能会成环,如果会成环,那就是不可能是合理工序,如果所有可能路径都不会成环,那就是合理工序。
  • 种类使用回溯实现的,具体如下
import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {static boolean[] visited;static boolean[][] matrix;static Set<Integer> set;static List<Integer> res;static boolean dfs(int curIdx){for(int i = 0;i < matrix[0].length;i ++){// 判断是否存在路径if(matrix[curIdx][i]){// 存在成环路径,直接返回if (visited[curIdx] || visited[i]) return false;// 存在路径,并且i是终止节点情况,直接跳过if(set.contains(i)) continue;// 存在路径,并且i不是终点的情况,需要递归访问visited[i] = true;if(!dfs(i))  return false;visited[i] = false;}}return true;}public static void main(String[] args) {set = new HashSet<>();res = new ArrayList<>();Scanner in = new Scanner(System.in);int count = in.nextInt();visited = new boolean[count];matrix = new boolean[count][count];for(int i = 0;i <= count;i ++){String line = in.nextLine();if(i == 0) continue;if( line.isEmpty())  set.add(i);Scanner lineScn = new Scanner(line);while(lineScn.hasNextInt()){int a = lineScn.nextInt();if(a == -1){set.add(i - 1);}else{matrix[i - 1][a] = true;}}lineScn.close();}// 遍历每一个元素for (int i = 0;i < count ;i ++){if(set.contains(i)) continue;//visited[i] = true;if(dfs(i)) set.add(i);Arrays.fill(visited,false);//visited[i] = false;}for(int x : set){res.add(x);}Collections.sort(res);for(int x : res) System.out.print(x + " ");}
}
  • 上述代码只能通过百分之四十的样例,然后剩下的怎么调节,都过不去了,这里专门复习一下,看一下一般来说怎么做的!
参考实现
  • 修改如下,正常的回溯我都想了很久,正常不应该是这样的,确定了回溯的迭代条件,以及终止条件就可以直接上模板了,不应该这样的!
  • 我的方法是针对无向图的环的检测,针对有向图的检测会出现问题的,这里还是建立使用三个状态来检测有向图的环,具体如下!
  • 三种状态
    • 0表示未访问
    • 1表示正在访问
    • 2表示已经访问,处理过当前节点,当前节点后续是不存在环的,直接跳过就行了!
boolean isCyclicUtil(int v,int[] visited){// 当前路径下确实存在环if(visited[v] == 1)	return true;// 检测是否已经是访问过的点if(visited[v] == 2)	return false;visited[v] = 1;for(int neighbour:adj.get(v)){if(isCyclicUtli(neighbour,vivited)){return true;}}visited[v] = 2;return false;
}public boolean isCyclic() {int[] visited = new int[V];for (int i = 0; i < V; i++) {if (isCyclicUtil(i, visited)) {return true;}}return false;}

三个状态,11成环,22非环,12中间是循环

小友策划游戏人物

  • 小友是一个游戏策划,他计划设计一个新人物,该人物的攻击模式较为特殊:他的附加攻击力可以拆分为n份(n>=2),这n份的乘积作为最终伤害值。游戏总监认为该人物过于超模(过于强大),要求对其附加攻击力增加上限限制。
  • 现在给你最终伤害值的上限和该人物的附加攻击力,请判断该人物的实际最终伤害值是否会超出给出的最终伤害值上限。
  • 输入描述
输入两个数值,第一个数值为最终伤害值上限,第二个数值为该人物的附加攻击力。
例如:2920 22
2920为最终伤害值的上限
22为该人物的附加攻击力
  • 输出描述
输入true或者false
true表示超出上限
false表示未超出上限
  • 补充说明
最终伤害值上限不会超过int最大值

示例一

  • 输入
1 2
  • 输出
false
  • 说明
最终伤害上限1
附加攻击力2
2=1+1
1*1=1
所以未超过上限
个人实现
  • 我用的方法应该是有问题的,是拆成尽可能大的两个数字的乘积,然后在计算最大值,具体如下
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int maxV = in.nextInt();int att = in.nextInt();long maxAtt = 0;for(int i = 2;i <= att;i ++){long tempAtt = (long) (Math.pow(i, (double) att / i) * (att % i));maxAtt = Math.max(maxAtt,tempAtt);}System.out.println(maxAtt > maxV);}
}
  • 这个题目还是要想想使用动态规划怎么做
参考实现
  • 之前学了那么久的闫氏DP分析法,这里得想想看怎么弄分析,从集合的角度出发!这道题目对于任意的数字都可以分成两个数字,然后划分点是从第一个点往后遍历到最终的结果,具体如下图
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int maxV = in.nextInt();int att = in.nextInt();int[] dp = new int[att + 1];dp[0] = 0;dp[1] = 0;dp[2] = 1;for(int i = 2;i <= att;i ++){for(int j = 1;j < i;j ++){dp[i] = Math.max(dp[i],Math.max(j * (i - j),Math.max(dp[j] * dp[i - j],Math.max(j * dp[i - j],dp[j] * (i - j)))));}}System.out.println(dp[att]);}
}

在这里插入图片描述

最佳工作任务安排

  • 小友所在的部门在进行一系列复杂的开发项目。为了优化开发流程,部门要求工程师在不同的任务之间切换。每个任务有不同的执行时间,有些任务因为各种原因无法进行(标记为-1)。工程师可以在规定的跳跃范围内从一个任务跳到另一个任务,但每次执行任务需要消耗相应的时间。
  • 你的目标是找到一个从任务列表开头到结尾的执行顺序,使得总执行时间最小。如果存在多个总执行时间相同的顺序,返回按索引值更小优先的顺序。如果无法到达最后一个任务,返回一个空数组。

规则

1.输入一个整数数组 tasks 表示任务执行时间,长度为 n。
2.输入一个整数 maxStep 表示单次切换任务的最大切换长度。
3.你从任务列表的第一个任务开始(tasks[0] 不是 -1)。
4.从任务 i 切换到任务 j,消耗的时间为 tasks[j]5.如果你当前位于任务 i,你只能跳到任务 i + k(满足 i + k <= n),其中 k 在范围 [1, maxStep] 内。
6.返回一个整数数组,包含你访问的任务索引顺序,使得总执行时间最小。如果存在多个总执行时间相同的顺序,返回索引值更小的顺序。

排序说明

如果存在多个总执行时间相同的顺序:
假设方案 p1 = [Pa1, Pa2, ..., Pax] 和方案 p2 = [Pb1, Pb2, ..., Pbx]。
如果在两个方案中第一个不同的索引 j 处,Pa[j] 小于 Pb[j],则选择方案 p1。
如果所有索引都相同,但任务切换次数不同,则选择任务切换次数较少的一个方案。
提示:注意排序规则,如 1-2-3-4-51-4-5 , 假设两个方案所消耗的时间成本相同, 那么前面的方案更优。

输入描述

整数 N,代表任务 tasks 的长度
长度为 N 的数组 tasks 的各个元素
整数 M,代表每次切换任务的最大跳跃长度

输出描述

输出数组,代表总执行时间最短,并且索引值最小的执行方案

补充说明

1 <= tasks.length <= 1000
-1 <= tasks[i] <= 100
tasks[0] != -1
1 <= maxStep <= 100

示例 1

输入

5
1 2 4 -1 2
2

输出

1 3 5
个人实现
  • 我单纯使用回溯实现的,因为我知道如果使用用DP只能求出来对应最大值,但是没有办法求出来具体路径,如果要求出来具体的路径,还是得使用回溯,所以,为了节省时间,直接写了两边回溯!
  • 中间本来想改成优先队列的,后来没时间改,就冲写了一个,原来的优先队列有没闪,下面是考试中的原来的代码,还没来及的复制上去!
import java.sql.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Scanner;public class Main {static int[] task;static PriorityQueue<List<Integer>> pq;static List<Integer> list;static List<Integer> res;static int maxV = 0;static int skipLen ;static void dfs(int curIdx ){if(curIdx < task.length && task[curIdx] == -1) return ;if(curIdx == task.length){int sum = 0;for(int i =0;i < list.size() - 1;i ++) sum += task[i];maxV = Math.max(maxV,sum);}// 遍历当前路径下的所有的步骤for (int i = 1; i <= skipLen && (curIdx + i) <= task.length;i ++ ){list.add(curIdx + i);dfs(curIdx + i);list.remove(list.size() - 1);}}static void dfs2(int curIdx ){if(curIdx < task.length && task[curIdx] == -1) return ;if(curIdx == task.length){int sum = 0;for(int i =0;i < list.size() - 1;i ++) sum += task[i];//System.out.println(sum);if(sum == maxV){if(res == null) res = list;else if(res.size() > list.size())  res = new ArrayList<>(list);}}// 遍历当前路径下的所有的步骤for (int i = 1; i <= skipLen && (curIdx + i) <= task.length;i ++ ){list.add(curIdx + i);dfs2(curIdx + i);list.remove(list.size() - 1);}}public static void main(String[] args) {Scanner in = new Scanner(System.in);int count = in.nextInt();task = new int[count];for(int i = 0;i < count;i ++)   task[i] = in.nextInt();skipLen = in.nextInt();pq = new PriorityQueue<>((List<Integer> a,List<Integer> b)->{int sumA = 0;for(int x:a) sumA += x;int sumB = 0;for(int x:b) sumB += x;return Integer.compare(sumA,sumB);});list = new ArrayList<>();dfs(0);dfs2(0);if(res == null)System.out.println("[]");else{System.out.println("1 ");for(int i = 0;i < res.size();i ++)System.out.print(res.get(i) + 1 + " ");}//        if(!pq.isEmpty())
//            for(int i = 0;i < pq.peek().size();i ++)
//                System.out.print(pq.peek().get(i) + " ");
//        else
//            System.out.println("[]");}
}
参考实现
  • 下述代码使用的是回溯和动态规划
  • 下面是使用了两个数组,一个是用来实现动态规划,还有一个是用来记录路径的!
  • 这道题感觉很像leetcode上面的青蛙跳,对应链接。
    在这里插入图片描述
    参考实现

还是最后一个状态为目标进行分析,假设可以跳跃K步,然后最后一步有几种可能

f[k] = x[k] + f[k - i] ,i从零到k
  • 然后选取上述值的最大值,如果f[k]是-1,中间就是断层的。
import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取输入int N = scanner.nextInt();int[] task = new int[N];for (int i = 0; i < N; i++) {task[i] = scanner.nextInt();}int M = scanner.nextInt();// 初始化 dp 数组final int INF = Integer.MAX_VALUE; // 使用 Integer.MAX_VALUE 代替 infint[] f = new int[N];Arrays.fill(f, INF);f[0] = 0;int[] fm = new int[N];Arrays.fill(fm, -1);// 动态规划for (int i = 1; i < N; i++) {if (task[i] == -1) continue;for (int k = 1; k <= M; k++) {if (i - k < 0) break;if (f[i - k] + task[i] < f[i] && task[i - k] != -1) {f[i] = f[i - k] + task[i];fm[i] = i - k;}}}// 回溯找到路径List<Integer> res = new ArrayList<>();int index = N - 1;while (true) {if (index == 0) {res.add(1);break;}res.add(index + 1);index = fm[index];}// 输出结果Collections.reverse(res); // 反转列表以从起点到终点for (int r : res) {System.out.print(r + " ");}scanner.close();}
}

大众评分最高的一次旅程

在这里插入图片描述

总结

  • 很难受,今天的题目偏难,不过能够写出来三道题,然后第三道题写完了,没来得及复制上去,好可惜!
  • 不过今天也反应出来很多问题,就是我的笔试能力还是不够!代码写的太慢了,尤其是回溯!
  • 最后一题,我连题目都没有见到,就不放在这里了!跳过了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/390038.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python练习2

文章目录 主要内容一.Python基础练习题1.密码验证合格程序代码如下&#xff08;示例&#xff09;: 2.两数之和代码如下&#xff08;示例&#xff09;: 3.字符个数统计代码如下&#xff08;示例&#xff09;: 总结 主要内容 Python基础练习题 一.Python基础练习题 1.密码验证合…

频率的工程测量01 - Rif算法的构造

1.原始文档 《用于正弦波频率估计的修正I-Rife算法》&#xff0c;王哲文&#xff0c;2024 DOI&#xff1a; 10. 16337/j. 1004‑9037. 2024. 02. 019 1.1 这篇论文所属的自科基金U21A20500&#xff1a;近5年所承担的重要科研项目表-智能感知系统与安全教育部重点实验室&#…

lua学习(1)

vscode打开c或者lua文件 插件显示禁用&#xff0c;怎么开启插件。 1. lua 字符串 单个引号和双引号都可变量的定义默认是全局的删除一个变量将其赋值为nil即可 如&#xff1a; bnilnil还可以对表中的数据进行删除&#xff0c;也可删除一个表只要变量不是nil&#xff0c;变…

c语言第七天笔记

作业题&#xff1a; 设计TVM&#xff08;地铁自动售票机&#xff09;机软件。 输入站数&#xff0c;计算费用&#xff0c;计费规则&#xff0c;6站2元&#xff0c;7-10站3元&#xff0c;11站以上为4元。 输入钱数&#xff0c;计算找零(找零时优先找回面额大的钞票)&#xff0…

Nat网络地址转换实验

一、实验拓扑 二、实验要求 三、实验思路 四、实验展示 1.接口IP配置 telnet路由器 r1 r2 r3 pc2 2.全网可达&#xff08;给边界路由器&#xff0c;私家路由器写上缺省 &#xff0c;还要用到nat地址转换&#xff0c;多对多一对多&#xff0c;端口映射&#xff09;因为左右…

华为LTC流程体系详解

LTC&#xff0c;全称Lead to Cash&#xff0c;中文翻译为从线索到现金&#xff0c;是一种企业运营管理思想&#xff0c;也是一个集成的业务流程。它涵盖了企业从接触客户到收到客户回款的整个流程&#xff0c;通过科学化管理&#xff0c;实现更高效地将线索客户转化为付费客户。…

说说ip地址和mac地址的区别

随着互联网的飞速发展&#xff0c;网络连接已成为我们日常生活中不可或缺的一部分。然而&#xff0c;在享受网络带来的便利时&#xff0c;你是否曾好奇过那些让设备能够相互通信的关键技术&#xff1f;IP地址与MAC地址&#xff0c;作为网络通信中的两大基石&#xff0c;它们各自…

3D生物打印咋实现?重组弹性蛋白来助力!

Human-Recombinant-Elastin-Based Bioinks for 3D Bioprinting of Vascularized Soft Tissues是发表于《ADVANCED MATERIALS》上的一篇文章&#xff0c;介绍了一种基于重组人原弹性蛋白的生物墨水&#xff0c;用于3D生物打印复杂软组织。该生物墨水由GelMA和MeTro组成&#xff…

[Docker][Docker Container]详细讲解

目录 1.什么是容器&#xff1f;2.容器命令1.docker creatre2.docker run3.docker ps4.docker logs5.docker attach6.docker exec7.docker start8.docker stop9.docker restart10.docker kill11.docker top12.docker stats13.docker container inspect14.docker port15.docker c…

设施农业“AutoML“时代:大模型自动调参,让农业算法模型更简单易用

&#xff08;于景鑫 北京市农林科学院智能装备技术研究中心&#xff09;设施农业是现代农业的重要发展方向,但在数字化、智能化的进程中仍面临诸多挑战。传统的农业算法模型虽然可以为设施农业提供一定的决策支持,但在实际应用中往往受限于参数调优复杂、模型泛化能力差等因素。…

实例分割-Yolact/Yolact++训练自己数据集

前言 本文主要用于记录实例分割模型yolact和yolact的环境配置&#xff0c;以及成功训练自己数据集的整个过程~ 注意&#xff1a;这里要重点提醒一下&#xff0c;DCNv2对RTX系列不友好&#xff0c;我第一次使用4090服务器&#xff0c;编译持续有问题&#xff0c;被迫放弃&#…

window安装elasticsearch和可视化界面kibana

ElasticSearch 官网下载zip安装包并解压 Elasticsearch&#xff1a;官方分布式搜索和分析引擎 | Elastic 修改配置文件 改选项是指定ssl访问还是普通http访问 不改的话使用http访问不了&#xff0c;得使用https 浏览器访问 localhost:9200 Kibana Download Kibana Free |…

Android Listview notifyDataSetChanged() 不起作用

private ArrayList<Map<String, String>> data new ArrayList<Map<String, String>>(); private ArrayList<Map<String, String>> delivered_data new ArrayList<Map<String, String>>(); 如果直接将arraylist 的数据直接…

机器学习-31-多变量异常检测LOF算法(实战)

一文读懂异常检测 LOF 算法(Python代码) 1 LOF算法 一个经典的异常检测算法:局部离群因子(Local Outlier Factor),简称LOF算法。 Local Outlier Factor(LOF)是基于密度的经典算法(Breuning et. al. 2000), 文章发表于SIGMOD 2000, 到目前已经有3000+的引用。 在LOF之前…

人大高瓴发布Think-on-Graph 2.0,基于知识图的大模型推理再升级!

经常参加高考的朋友可能会体会到&#xff0c;比起死记硬背知识点&#xff0c;将知识整理成脉络往往会获得事半功倍的效果。其实对于大模型来说也是如此&#xff0c;哪怕被允许“开卷作答”&#xff0c;即通过检索增强&#xff08;Retrieval-augmented generation&#xff0c;RA…

HCIP学习作业一 | HCIA复习

要求&#xff1a; R1-R2-R3-R4-R5 RIP 100 运行版本2 R6-R7 RIP 200 运行版本1 1.使用合理IP地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条目数量&#xff0c;R1-R2之间…

【AD域】搭建AD域服务器

环境 服务器&#xff1a;Windows Server 2016 Standard&#xff0c;版本1607 准备 1、设置主机名 2、配置静态IP地址 3、以本地管理员权限登录服务器 步骤 1、在服务器添加【Active Directory】域服务功能 2、AD域服务器配置

fastjson-小于1.2.47绕过

参考视频&#xff1a;fastjson反序列化漏洞3-<1.2.47绕过_哔哩哔哩_bilibili 分析版本 fastjson1.2.24 JDK 8u141 分析流程 分析fastjson1.2.25更新的源码&#xff0c;用JsonBcel链跟进 先看修改的地方 fastjson1.2.24 if (key JSON.DEFAULT_TYPE_KEY && !…

校园课程助手【4】-使用Elasticsearch实现课程检索

本节将介绍本项目的查询模块&#xff0c;使用Elasticsearch又不是查询接口&#xff0c;具体流程如图所示&#xff08;如果不了解Elasticsearch可以使用sql语句进行查询&#xff09;&#xff1a; 这里是两种方法的异同点&#xff1a; Mysql&#xff1a;擅长事务类型操作&#…

PHP苹果 V X iPhone微商i o s多分开V X语音转发密友朋友圈一键跟圈软件

苹果VX神器&#xff01;iPhone微商必备&#xff1a;ios多开、VX语音转发、密友朋友圈一键跟圈软件大揭秘&#xff01; 一、iOS多开新境界&#xff0c;工作生活两不误&#xff01; 你是不是也烦恼过&#xff0c;想要在工作号和生活号之间自由切换&#xff0c;却因为iPhone的限制…