美团 笔试 9.10 除了第四题的答案
题目链接:https://www.nowcoder.com/discuss/1047568
1、简单的比大小。
选择1:规规矩矩的除,然后根据差值小于一个很小的数认为相等,可以过,或者把除法换成乘法
package mt.笔试; import java.math.BigInteger; import java.util.Scanner; /* */ public class t1 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int T = in.nextInt(); for(int i = 0; i < T; i++){ int n = in.nextInt(), x = in.nextInt(), y = in.nextInt(), k = in.nextInt(); BigInteger p1 = BigInteger.valueOf(k).multiply( BigInteger.valueOf( y)); BigInteger p2 = BigInteger.valueOf((n-k+1)).multiply(BigInteger.valueOf(x)); if(p1.equals(p2)){ System.out.println("Tie"); }else if(p1.compareTo(p2) > 0){ System.out.println("Lose"); }else{ System.out.println("Win"); } } } }
2、神经网络
乘积不等于0,贪心,把所有为0的 一律加个1
只需要满足 和不等于0的条件就可以了。 相当于你只需要在一个位置变化就可以,尝试每一个位置
package mt.笔试; import java.util.Scanner; /* 神经网络 时间限制: 3000MS 内存限制: 589824KB 题目描述: 某天,小美在调试她的神经网络模型,这个模型共有n个参数,目前这些参数分别为a1、a2、…、an, 为了让参数看起来更加随机而且增加训练效果,她需要调节参数使所有参数满足a1+a2+…+an≠0且a1*a2*…*an≠0,她每次可以选择一个参数ai并将其变为ai+1,小美请你帮她计算一下,最少需要几次操作才能使参数达到她的要求。 输入描述 第一行一个正整数n,表示参数个数。 第二行为n个正整数a1, a2,...... an,其中ai表示第i个参数初始值。 1 ≤ n ≤ 30000,-1000 ≤ ai ≤ 1000。 输出描述 输出一个正整数,表示最少需要的操作次数。 */ public class t2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); //1] 所有为0 的必须处理 //2 不是0的 枚举每一个位置 最少变化多少? int n = in.nextInt(); int count = 0; int[] arr = new int[n]; int sum = 0; for(int i = 0; i < n; i++){ arr[i] = in.nextInt(); if(arr[i] == 0){ count++; arr[i] += 1; } sum += arr[i]; } if(sum != 0){ System.out.println(count); return; } //sum = 0 改变任何一个都可以 int preCost = Integer.MAX_VALUE; for(int i = 0; i < n; i++){ int cost = 0; if(arr[i] < 0){ cost = arr[i] == -1 ? 2 : 1; }else{ cost = 1; } preCost = Math.min(preCost, cost); } System.out.println(preCost+count); } }
3、迷宫
就是一颗二叉树上的进行
因为求最大价值,我的枚举是,必须获得这个宝藏情况下,得到的最大价值是多少。
注意可能,一个位置多个宝藏
package mt.笔试; /* 时间限制: 3000MS 内存限制: 589824KB 题目描述: 某天小美进入了一个迷宫探险,根据地图所示,这个迷宫里有无数个房间,序号分别为1、2、3、…、∞,入口房间的序号为1,任意序号为正整数x的房间都与序号2*x和2*x+1的房间之间各有一条路径,但是这些路径是单向的,即只能从序号为x的房间去到序号为2*x或2*x+1的房间,而不能从序号为2*x或2*x+1的房间去到序号为x的房间。在任何时刻小美都可以选择结束探险并离开迷宫,但是离开之后将无法再次进入迷宫。小美还提前了解了迷宫中宝藏的信息,已知宝藏共有n个,其中第 i 个宝藏在序号为pi的房间,价值为wi,且一个房间中可能有多个宝藏。小美为了得到更多的宝藏,需要精心规划路线,她找到你帮忙,想请你帮她计算一下,能获得的宝藏价值和最大值为多少。 输入描述 第一行一个正整数n,表示宝藏数量。 第二行为n个正整数p1, p2,...... pn,其中pi表示第 i 个宝藏在序号为pi的房间。 第三行为n个正整数w1, w2,...... wn,其中wi表示第i个宝藏的价值为wi。 数字间两两有空格隔开 1 ≤ n ≤ 40000, 1 ≤ pi <230, 1 ≤ wi ≤ 106。 输出描述 输出一个正整数表示能获得的宝藏价值之和的最大值。 */ import java.math.BigInteger; import java.util.HashMap; import java.util.LinkedList; import java.util.Scanner; public class t3 { public static void main(String[] args) { Scanner in = new Scanner(System.in); //必须获得宝藏i情况下 最大价值是多少? int n = in.nextInt(); long[] space = new long[n]; long[] val = new long[n]; for(int i = 0; i < n; i++){ space[i] = in.nextLong(); } HashMap<Long, Long> map = new HashMap<>(); for(int i = 0; i < n; i++){ val[i] = in.nextInt(); if(map.containsKey(space[i])){ map.put(space[i], map.get(space[i])+val[i]); }else{ map.put(space[i], val[i]); } } BigInteger[] dp = new BigInteger[n]; BigInteger ans = BigInteger.valueOf(0); //dp[i] 必须到space[i] 的情况下 收获的价值是多少 for(int i = 0; i < n; i++){ dp[i] = process(space[i], map); ans = dp[i].compareTo(ans) > 0 ? dp[i] : ans; } System.out.println(ans); } //从cur位置出发 必须到达aim 物资·信息为map //最大价值是多少 public static BigInteger process( long aim, HashMap<Long, Long> map){ LinkedList<Long> list = new LinkedList<>(); while(aim != 1){ list.add(aim); aim = aim / 2; } list.add(1L); BigInteger count = BigInteger.valueOf(0); for(long i : list){ if(map.containsKey(i)){ count = count.add(BigInteger.valueOf(map.get(i))); } } return count; } }
4 没过,bfs总是超时,怎么优化都没好
5、最后一个位置为i的子串,最长长度是多少。动态规划
package mt.笔试; import java.util.Scanner; /* 777 时间限制: 3000MS 内存限制: 589824KB 题目描述: 小美有一串项链,项链共由n颗宝石组成,每个宝石上都有一个数字。但是有一天项链不小心被弄断了 ,变成了一长串,此时可以看成一个只包含数字的字符串,于是她准备将项链从某些地方切开后再重新分成多段( 每段都是原来字符串的连续子串,且不能再重新组合), 因为小美特别喜欢7这个数字,所以她希望切开后每段的数字和都尽可能被7整除。 例如,假设项链表示为12457,可以切分为124|5|7,第一段和第三段的和能被7整除。她想请你帮她算一算 ,切开后最多能有多少段的数字和能被7整除。 输入描述 一行,一个字符串s,s的每位都是数字。 1 ≤ |s| ≤ 100000,|s| 表示s的长度。 输出描述 输出一个整数,表示切开后最多能有多少段的数字和是7的倍数。 */ public class t5 { public static void main(String[] args) { Scanner in = new Scanner(System.in); char[] arr = in.nextLine().toCharArray(); int n = arr.length; int[] dp = new int[n]; dp[0] = arr[0] == '7' || arr[0] == '0'? 1 : 0; int preMax = dp[0]; for(int i = 1; i < n; i++){ //i结尾 一定是7的倍数 int p1 = 0; int sum = arr[i] - '0'; if(sum == 7 || sum == 0){ dp[i] = preMax + 1; preMax = preMax+1; continue; } boolean has7 = false; int j = i-1; for(; j >= 0; j--){ sum += arr[j] - '0'; if(sum % 7 == 0){ has7 = true; break; } } if(has7){ //j...i 是倍数 if(j == 0){ p1 = 1; }else{ p1 = dp[j-1] + 1; } } dp[i] = Math.max(p1, preMax); preMax = Math.max(preMax, dp[i]); } System.out.println(dp[n-1]); } }#美团笔试##美团##23届秋招笔面经#