蓝桥算法训练__普及组.Day4

第一题:P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

package 蓝桥算法训练__普及组.Day4;

import java.util.Scanner;

/**
 * @author snippet
 * @data 2023-02-08
 * P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
 */
public class T1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n+1];
        int[] dp = new int[n+1];
        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextInt();
        }
        
        int ans = a[1];
        dp[1] = a[1];
        
        for (int i = 2; i <= n; i++) {
            dp[i] = Math.max(a[i], dp[i-1]+a[i]);
            ans = Math.max(ans, dp[i]);
        }
        System.out.println(ans);
    }
}

第二题:P1678 烦恼的高考志愿 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

package 蓝桥算法训练__普及组.Day4;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author snippet
 * @data 2023-02-08
 * P1678 烦恼的高考志愿 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
 */
public class T2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();// 学校数
        int n = sc.nextInt();// 学生数
        int[] a = new int[m+1];
        int[] b = new int[n+1];
        long ans = 0;
        for (int i = 1; i <= m; i++) {
            a[i] = sc.nextInt();
        }
        for (int i = 1; i <= n; i++) {
            b[i] = sc.nextInt();
        }

        Arrays.sort(a,1,m+1);

        // 每个学生进行选取一次
        // 就是每个学生进行一次二分选取
        for (int i = 1; i <= n; i++) {
            int left = 1;
            int right = m;
            while (left < right) {
                int mid = left + right >> 1;
                if (b[i] >= a[mid]) {
                    left = mid+1;
                } else {
                    right = mid;
                }
            }
            
            if (b[i] >= a[1]) {
                ans += Math.min(Math.abs(b[i]-a[left]), Math.abs(b[i]-a[left-1]));
            } else {
                // 特判学生的分数小于所有学校录取分数的时候
                // 因为比较是 下标left的学校和下标left-1的学校做对比
                // 当left为1时 也就是学生的参加小于所有学校的录取分数
                // 如果还是使用 Math.min(Math.abs(b[i]-a[left]), Math.abs(b[i]-a[left-1]))
                // 则会影响答案结果
                ans += a[1]-b[i];
            }
        }

        System.out.println(ans);
    }
}

第三题:P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

package 蓝桥算法训练__普及组.Day4;

import java.util.Scanner;

/**
 * @author snippet
 * @data 2023-02-08
 * P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
 */
public class T3 {
    static int n,m;
    static int N = 1000100;
    static int[] a = new int[N];

    // 判断当截取数的高度为mid时 所能得到的树的长度
    static boolean check(int mid) {
        long sum = 0;
        for (int i = 1; i <= n; i++) {
            if (a[i] > mid) {
                sum += a[i] - mid;
            }
        }
        //System.out.println(sum);
        if (sum >= m) {
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextInt();
        }

        int left = 1;
        int right = (int)1e9;
        while (left < right) {
            int mid = left + right + 1 >> 1;
            if (check(mid)) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }

        System.out.println(left);
    }
}

第四题:519. 跳石头 - AcWing题库

package 蓝桥算法训练__普及组.Day4;

import java.util.Scanner;

/**
 * @author snippet
 * @data 2023-02-08
 * 519. 跳石头 - AcWing题库
 */
public class T4 {
    static int l,n,m;
    static int N = 50050;
    static int[] a = new int[N];

    // 判断当距离为mid时 移走的岩石的数量是否满足条件
    static int check(int mid) {
        // last是终止位置 count是移除的石头的数量
        int last = 0, count = 0;
        for (int i = 1; i <= n; i++) {
            if (a[i] - last < mid) {
                count++;
            } else {
                last = a[i];
            }
        }
        return count;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        l = sc.nextInt();
        n = sc.nextInt();
        m = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextInt();
        }
        // 注意:要把整个石头路的长度记录下来
        a[++n] = l;

        int left = 1;
        int right = (int) 1e9;
        while (left < right) {
            int mid = left + right + 1 >> 1;
            if (check(mid) <= m) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        System.out.println(left);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值