递增三元组(蓝桥杯)

给定三个整数数组
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 

解析:题目中说三个数必须满足:Ai < Bj < Ck ,我的思路是用三个数组来存放三行数据, 然后将每一个数组排序,然后再比较数据。例如三个数组分别为a[i]、b[j]、c[k],用三个for循环比较,因为三个数组都是从小打到,所以在比较过程中如果a[i]>=b[j],或者是b[j]>=c[k]时就停止向下比较,因为往下比较数越来越大,这样就将时间复杂度大大缩短了。

代码如下:

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

class cmp implements Comparator<Integer>
{
	@Override
	public int compare(Integer o1, Integer o2)
	{
		if(o1!=o2)
		{
			return o2-o1;     //降序
		}
		return 0;
	}
}

public class 递增三元组
{
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int[] a = new int[n];   //存第一行数据
		Integer[] b = new Integer[n];   //存第二行数据
		Integer[] c = new Integer[n];   //存第三行数据
		int cnt = 0;
		for(int i=0;i<n;++i)
		{
			a[i] = in.nextInt();
		}
		for(int i=0;i<n;++i)
		{
			b[i] = in.nextInt();
		}
		for(int i=0;i<n;++i)
		{
			c[i] = in.nextInt();
		}
		Arrays.sort(a);   //升序排序
		Arrays.sort(b,new cmp());   //降序排序
		Arrays.sort(c,new cmp());   //降序排序
		for(int i=0;i<n;++i)
		{
			for(int j=0;j<n;++j)
			{
				if(a[i]>=b[j])   //只要a[i]>=b[j],再往下比较都不符合
				{
					break;
				}
				for(int k=0;k<n;++k)
				{
					if(b[j]>=c[k])  //只要b[j]>=c[k],再往下比较都不符合
					{
						break;
					}
					cnt++;    //符合a[i]<b[j]<c[k]
				}
			}
		}
		System.out.println(cnt);  //符合个数
	}
}

运行结果:

输入:

3
1 1 1
2 2 2
3 3 3

输出:

27

输入:

4
1 2 3 4
1 2 3 4
1 2 3 4

输出:

4

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值