1. 程式人生 > 其它 >區間數k大數查詢

區間數k大數查詢

題目

問題描述
給定一個序列,每次詢問序列中第 l 個數到第 r 個數中第 K 大的數是哪個。
輸入格式
第一行包含一個數 n,表示序列長度。
第二行包含 n 個正整數,表示給定的序列。
第三個包含一個正整數 m,表示詢問個數。
接下來 m 行,每行三個數 l,r,K,表示詢問序列從左往右第 l 個數到第 r 個數中,從大往小
第 K 大的數是哪個。序列元素從 1 開始標號。
輸出格式
總共輸出 m 行,每行一個數,表示詢問的答案。
樣例輸入
5
1 2 3 4 5
2
1 5 2
2 3 2
樣例輸出
4
2
資料規模與約定
對於 30%的資料,n,m<=100;
對於 100%的資料,n,m<=1000;
保證 k<=(r-l+1),序列中的數<=106。

程式碼:

import java.util.Scanner;

public class A {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int[] a=new int[n];
        for(int i=0;i<n;i++){
            a[i]=scanner.nextInt();
        }
        for (int i = 1; i < n; ++i) {
            int temp = a[i];
            int j = 0;
            for (j = i-1; j >= 0; j--) {
                if (a[j] > temp) {
                    a[j+1] = a[j];
                }else {
                    break;
                }
            }
            a[j+1] = temp;
        }

        int m=scanner.nextInt();
        int[] l,r,k=new int[m];
        for(int i=0;i<m;i++){
            l[i]=scanner.nextInt();
            r[i]=scanner.nextInt();
            k[i]=scanner.nextInt();
        }
        for(int i=0;i<m;i++){

            for(int j=0;j<n;j++){
                if(r[i]==a[j]){
                    System.out.println(a[j-b[i][2]+1]);
                }
            }
        }

        scanner.close();
    }
}

執行結果: