美团 笔试 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届秋招笔面经#
全部评论
第3题可以从最下层开始倒推回1号房间,路径是唯一的,所以可以用哈希表记录每个节点的价值(多个宝藏放在同一节点加算),每个宝藏倒推回去求最大值就可以了
1 回复 分享
发布于 2022-09-10 23:54 浙江
除了第四个都是100%过了的,没过的话我也没必要写啊
1 回复 分享
发布于 2022-09-10 20:07 北京
题目链接:https://www.nowcoder.com/discuss/1047568?type=post&order=create&pos=&page=1&ncTraceId=&channel=-1&source_id=search_post_nctrack
1 回复 分享
发布于 2022-09-10 18:50 北京
感谢分享,抄一下你的题目
点赞 回复 分享
发布于 2022-09-10 21:49 湖南
请问第三个是100通过了吗
点赞 回复 分享
发布于 2022-09-10 20:05 黑龙江
第五题不会超时么?感觉复杂度是On²啊
点赞 回复 分享
发布于 2022-09-10 19:35 四川
题目链接怎么被删了
点赞 回复 分享
发布于 2022-09-10 19:02 广东
想问问大佬,第三题用数组感觉是一样的, sum[i] = value[i]+sum[i/2],但是只能过82,大佬知道是为什么吗?
点赞 回复 分享
发布于 2022-09-10 18:58 美国
感谢大佬
点赞 回复 分享
发布于 2022-09-10 18:55 湖南

相关推荐

点赞 评论 收藏
分享
评论
10
23
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务