大赛题目:
给定三个整数数组
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,图解如下图所示: