8.19 美团 a4题

1.简单取余

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int q = in.nextInt();
        for(int i=0;i<q;++i){
            int m = in.nextInt();
            int x = in.nextInt();
            System.out.println((x-1)%m+1);
        }
    }

2.遍历即可

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] arr = new int[n];
        long sum = 0;
        for(int i=0;i<n;++i){
            arr[i] = in.nextInt();
            sum+=arr[i];
        }
        long maxm = sum;
        for(int i=1;i<n;++i){
            //不强转long 只能过50%
            maxm = Math.max(maxm,sum-arr[i]-arr[i-1]+(long)arr[i]*arr[i-1]);
        }
        System.out.println(maxm);
    }

3.无脑动规了,还有很多优化空间,但是懒得想了

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        int n = s.length();
        long sum = 0;
        for (int i = 0; i < n; ++i) {
            int[][] dp = new int[n][2];
            if (s.charAt(i) == '0') {
                dp[i][0] = 0;
                dp[i][1] = 1;
            } else {
                dp[i][0] = 1;
                dp[i][1] = 0;
            }
            for (int j = i + 1; j < n; ++j) {
                if (s.charAt(j) == '0') {
                    dp[j][0] = dp[j - 1][1];
                    dp[j][1] = dp[j - 1][0] + 1;
                } else {
                    dp[j][0] = dp[j - 1][1] + 1;
                    dp[j][1] = dp[j - 1][0];
                }
                sum += Math.min(dp[j][0], dp[j][1]);
            }
        }
        System.out.println(sum);
    }

4.背包问题

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] a = new int[n];
        int sum = 0;
        for (int i = 0; i < n; ++i) {
            a[i] = in.nextInt();
            sum += a[i];
        }
        if (n == 1 || sum == n) {
            System.out.println(0);
            return;
        }
        long[][] dp = new long[n][sum + 1];
        for (int i = 1; i <= sum; ++i) {
            dp[0][i] = 1;
        }
        dp[0][a[0]] = 0;
        int mod = 1000000007;
        for (int i = 1; i < n; ++i) {
            for (int j = 1; j < sum; ++j) {
			  //不得与原位置的数相同
                if (j == a[i]) continue;
                for (int k = i; k < sum && j + k <= sum; ++k) {
                    dp[i][j + k] = (dp[i][j + k] + dp[i - 1][k]) % mod;
                }
            }
        }
        System.out.println(dp[n - 1][sum]);
    }

5.第五题看题目意思是存在多个众数,实在不会做,就按照只有一个众数骗分也是0

全部评论
大佬我想请问下,为什么for int j 里面还嵌套了一个 for int k 啊怎么理解
点赞 回复 分享
发布于 2023-08-20 23:05 广东
for (int k = i; k < sum && j + k <= sum; ++k) { dp[i][j + k] = (dp[i][j + k] + dp[i - 1][k]) % mod; } 这个地方为什么要k=i呀?不太明白
点赞 回复 分享
发布于 2023-08-20 11:21 浙江
大佬的代码可读性真高 ,能说下你第四题的思路吗,这个状态转移方程是啥意思
点赞 回复 分享
发布于 2023-08-20 11:06 江西
第五题他们题解都是众数只有一个的情况,所以题出错了,被美团坑了😂
点赞 回复 分享
发布于 2023-08-19 21:19 四川
我想问问,如果我对于每一个子串单独分析,用dp这样可以么😂
点赞 回复 分享
发布于 2023-08-19 21:19 上海

相关推荐

用微笑面对困难:这里面最强的是驾驶证了,可以入职美团大厂,然后直接开启黄马褂人生
点赞 评论 收藏
分享
机智的大学生这就开摆:有些地方描述有点儿空泛。传感器直接说清是哪款,要不然对方都不知道问啥。然后freertos那里的描述也是,加上freertos就实现了实时性吗?可以说基于freertos的调度,结合xxx优化/xxx技术实现了xxx检测的实时性。同时freertos也能实现异步io,也能实现灵活的并行架构和高并发。 检测时效性的问题要考虑哪里需要时效性,摔倒检测需要通过中断实现,至于温度这种大惯量就不需要,方案细节理清楚。然后freertos那里提升响应速度用的消息队列不是太合适,可以说是用的notify反正和消息队列差不多,或者说指针传参来优化消息队列的值传递进而提升线程间通信效率。 但凡是搞过开发的看一眼你的简历就知道有问题了,需要重新整理技术路线优化一下。首先搞清楚技术路线,描述好软硬框架,体现性能优化/低功耗等。例如后续针对xxx功能进行了xxx的优化,实现了xxx成果(这里可以展开描述你使用的工具链,你是用的串口调试助手还是RTT来打印日志,有没有用systemview来优化任务的优先级大小避免乱序调度,或者使用了Ozone调试定位问题等)。 描述问题上例如视觉项目那里,基于xxx通信接口编写xxx传感器的驱动,实现了xxx功能,并提供了xxx数据处理/稳定性/精确度/异步调用。或者也可以统一描述为基于xxx、xxx、xxx通讯协议编写xxx、xxx、xxx传感器的驱动。后续再单独给这些传感器的数据处理/优化等进行描述。 最重要的一点,实习栏太少了,五六个月不至于只干了这么点,把实习项目描述清楚,把自己会的不管有没有让你做都写进去。你写了实习这栏,内容就不能比剩下的两个项目差多少了。 最后就是看看岗位jd,跟着描述修改你的专业技能以及项目的描述,这样被回复的概率才大。 希望你早日找到理想工作!祝好
点赞 评论 收藏
分享
评论
5
21
分享

创作者周榜

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