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

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

相关推荐

评论
5
21
分享
牛客网
牛客企业服务