第十四届蓝桥杯 三十天刷题 第十七天

文章介绍了两个编程问题的解决方案。第一个问题是关于ASCII码的简单计算,直接输出L减A加上65即可。第二个问题涉及找到数组中的递增三元组,通过优化的二分查找方法,对数组a和c排序,遍历数组b并进行二分查找,计算符合条件的三元组数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

📢📢📢哈喽呀,大家好,来看今天的题目吧


  1. 🍭🍭🍭ASC🍭🍭🍭

📋问题描述

❓思路分享

🍭直接输出L-A+65即可

📗参考代码

/**
 * @ClassName ASC
 * @Author @浅夜
 * @Date 2023/3/20 20:30
 * @Version 1.0
 */

public class Main {
    public static void main(String[] args) {
        System.out.println('L' - 'A' + 65);
    }
}


  1. 🍑🍑🍑递增三元组🍑🍑🍑

📋问题描述

❓思路分享

🍑最直接的想法就是根据题意来暴力了,但是三个for循环下来会超时是毋庸置疑的,如果直接暴力就会超时三个样例,那么就需要优化了

那么这个暴力如何优化呢?

🍑分别对a,c数组进行排序,我们可以遍历b数组,依次二分查找出a数组中小于该元素的最大值,c数组中大于该元素的最小值。然后计算出两边符合条件的元素个数,相乘就是每种b数组元素下的方案数,累加起来就是总的递增三元组的个数。

📗参考代码

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

/**
 * @ClassName 递增三元组_二分
 * @Author @浅夜
 * @Date 2023/3/20 21:15
 * @Version 1.0
 */

public class 递增三元组_二分 {
    static int N = 100010;
    static int[] a = new int[N], b = new int[N], c = new int[N];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) a[i] = sc.nextInt();
        for (int i = 0; i < n; i++) b[i] = sc.nextInt();
        for (int i = 0; i < n; i++) c[i] = sc.nextInt();
        Arrays.sort(a, 0, n);
        Arrays.sort(c, 0, n);
        long ans = 0;
        for (int i = 0; i < n; i++) {
            int l = 0, r = n - 1;
            while (l < r) {
                int mid = (l + r + 1) >> 1;
                if (a[mid] < b[i]) l = mid;  //此时a数组中的mid偏小,舍去二分左边,保留右边
                else r = mid - 1;
            }
            int t = r;   //备份a数组二分的结果
            l = 0;
            r = n - 1;
            while (l < r) {
                int mid = l + r >> 1;
                if (c[mid] > b[i]) r = mid;  //此时c数组中的mid下标元素偏大,舍去右边,找最小满足的
                else l = mid + 1;
            }
            if (b[i] > a[t] && b[i] < c[r]) ans += (long)(t + 1) * (n - r);
        }
        System.out.println(ans);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值