-
题目:
资源限制
内存限制:256.0MB Java时间限制:3.0s
问题描述
给出一个n长的数列,再进行m次询问,每次询问询问两个区间[L1,R1],[L2,R2],
询问数列第L2到R2个数字每一个数在数列第L1到R1个数中有多少个数字不大于它。输入格式
第一行两个整数n,m
第二行n个整数,表示数列。
接下来m行,每行四个整数L1,R1,L2,R2,意义如上输出格式
m行,每行R2-L2+1个整数,第一个整数表示第L2个数在数列第L1到R1个数中不大于它的个数,第一个整数表示第L2+1个数在数列第L1到R1个数中不大于它的个数,以此类推
样例输入
5 3
5 2 3 4 1
1 2 3 4
2 3 1 5
1 5 2 3样例输出
1 1
2 1 2 2 0
2 3
-
思路:暴力解决
- 分三层循环解决,第一层是询问的次数m;第二层是比较的数(即[L2,R2]);第三层为被比较的数的范围(即[L1,R2])。
- 在[L2,R2]每个数比较时用sum记录符合题目要求的个数。
-
代码:
package BlueBridge;
import java.util.Scanner;
public class CompareNum {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] nums = new int[n];
for (int i = 0; i < nums.length; i++) {
nums[i] = in.nextInt();
}
int[][] orders = new int[m][4];
for (int i = 0; i < orders.length; i++) {
for (int j = 0; j < orders[i].length; j++) {
orders[i][j] = in.nextInt();
}
}
for (int i = 0; i < orders.length; i++) {
for (int j = orders[i][2]-1;j< orders[i][3];j++){
int sum = 0;
for (int k = orders[i][0]-1; k < orders[i][1] ; k++) {
if (nums[j]>=nums[k])
sum++;
}
System.out.print(sum+" ");
}
System.out.println();
}
in.close();
}
}
(有错误欢迎指正哈,如果有不小心侵权的联系删除哈😁)