java三元组表示_第九届蓝桥杯java B组—第六题递增三元组(详细介绍)-Go语言中文社区...

大赛题目:

给定三个整数数组

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,否则按无效代码处理。

代码实例

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

A[i] = sc.nextInt();

}for(int i=0;i

B[i] = sc.nextInt();

}for(int i=0;i

C[i] = sc.nextInt();

}

}

}

public static void f() {

for(int i=0;i

for(int j=0;j

for(int k=0;k

if(A[i]

sum++;

}

}

}

}

}

}

运行结果

3

1 1 1

2 2 2

3 3 3

27

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

代码实例:

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

A[i] = scanner.nextInt();

}

for(int i = 0;i

B[i] = scanner.nextInt();

}

for(int i = 0;i

C[i] = scanner.nextInt();

}

//定义一个计数器,记录最终的结果数sum

@SuppressWarnings("unused")

//first是第二行数据中的第一个数比第一行数据中的数大的个数,two是第三行数据中的数比第一行数据中的第一个数大的个数,以此类推

int sum = 0,first = 0,two = 0;

//判断

for(int i = 0;i

for(int j = 0;j

if(B[j]>A[i]) {

first++;

}

System.out.println("first:"+first);

}

for(int k = 0;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();

}

}

详细讲解:

因为我们把第一行数据放到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,图解如下图所示:

961e9ef8565769a707eb5565f5ee4334.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值