第九届蓝桥杯java B组—第六题递增三元组(详细介绍)

本文探讨了一个关于三数组的匹配问题,旨在找出满足特定条件的所有三元组。通过对两种不同代码实现的分析,展示了如何有效地解决这个问题,并提供了详细的运行结果和代码解释。

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

1.大赛题目

给定三个整数数组
A = [A1, A2, … AN],
B = [B1, B2, … BN],
C = [C1, C2, … CN],
请你统计有多少个三元组(i, j, k) 满足:

1. 1 <= i, j, k <= N
2. Ai < Bj < Ck

【输入格式】
第一行包含一个整数N。
第二行包含N个整数A1, A2, … AN。
第三行包含N个整数B1, B2, … BN。
第四行包含N个整数C1, C2, … CN。

对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000

【输出格式】
一个整数表示答案

【输入样例】
3
1 1 1
2 2 2
3 3 3

【输出样例】
27

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

2.代码实例1

public class Lanqiaoninthsix {
	static Scanner sc = new Scanner(System.in);
	// 输入第一行N
	static int N = sc.nextInt();
	static int sum = 0;
	// 定义三个数组A、B、C
	static int A[] = new int[N];
	static int B[] = new int[N];
	static int C[] = new int[N];
	
	public static void main(String[] args) {
		input();
		f();
		System.out.println(sum);
	}
	public static void input() {
		// for循环输入三个数组
		if(N>=1 && N<=100000) {			//对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000 
			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();
			}
		}
	}
	public static void f() {
		for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				for(int k=0;k<N;k++) {
					if(A[i]<B[j] && B[j]<C[k] ) {	//Ai < Bj < Ck  
						sum++;
					}
				}
			}
		}
	}
}

3.运行结果

3
1 1 1
2 2 2
3 3 3
27

以上这种暴力的方法可能会超时,下面看另外一种相似的解法

4.代码实例2

public class test {
	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		Integer N = scanner.nextInt();
		//定义三个数组
		int A[] = new int[N];
		int B[] = new int[N];
		int C[] = new int[N];
		//初始化三个数组
		for(int i = 0;i<N;i++) {
			A[i] = scanner.nextInt();
		}
		for(int i = 0;i<N;i++) {
			B[i] = scanner.nextInt();
		}
		for(int i = 0;i<N;i++) {
			C[i] = scanner.nextInt();
		}
		//定义一个计数器,记录最终的结果数sum
		@SuppressWarnings("unused")
		//first是第二行数据中的第一个数比第一行数据中的数大的个数,two是第三行数据中的数比第一行数据中的第一个数大的个数,以此类推
		int sum = 0,first = 0,two = 0;
		//判断
		for(int i = 0;i<N;i++) {
			for(int j = 0;j<N;j++) {
				if(B[j]>A[i]) {
					first++;
				}
				System.out.println("first:"+first);
			}
			
			for(int k = 0;k<N;k++){
				if(C[k]>B[i]) {
					two++;
				
				}
				System.out.println("two:"+two);
			}
			sum += first*two;
			//每一轮循环之后都要将first、two重设为0
			first = 0;
			two = 0;
		}
		System.out.println(sum);
		//申请了资源要记得归还
		scanner.close();
	}
}

5.详细讲解

因为我们把第一行数据放到A数组里面了
把第二行数据放到B数组里面了
把第三行数据放到C数组里面了

所以

第一次最外层循环:

比较第二行数据中的第一个数2跟第一行数据中的所有的数比较
如果比其大的,则加1,所以第一次比较的结果为3。
同理,第三行数据中的所有的数跟第二行的第一个数进行比较,如果比其大
的,则加1,所以第二次比较的结果也为3。两个值相乘3*3=9;这是第一次循环的值

第二次最外层循环:

比较第二行数据中的第二个数2跟第一行数据中的所有的数比较
如果比其大的,则加1,所以第一次比较的结果为3。
同理,第三行数据中的所有的数跟第二行的第二个数进行比较,如果比其大
的,则加1,所以第二次比较的结果也为3。两个值相乘3*3=9;这是第二次循环的值

第三次最外层循环:

比较第二行数据中的第三个数2跟第一行数据中的所有的数比较
如果比其大的,则加1,所以第一次比较的结果为3。
同理,第三行数据中的所有的数跟第二行的第三个数进行比较,如果比其大
的,则加1,所以第二次比较的结果也为3。两个值相乘3*3=9;这是第三次循环的值

最终结果9+9+9=27,图解如下图所示:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁同学与Android

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值