目录

1 问题描述

2 解决方案

 


1 问题描述

问题描述

给定一个序列,每次询问序列中第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。


2 解决方案

本题主要考查排序,考虑到时间效率和稳定性,此题选择合并排序最佳。

具体代码如下:

import java.util.Scanner;

public class Main {
//对数组array中下标start到end中的元素进行归并并排,求得该区间的降序排列
public void mergeSort(int[] array, int start, int end) {
if(end - start >= 1) {
int[] leftArray = getHalfArray(array, start, end, 0);
int[] rightArray = getHalfArray(array, start, end, 1);
mergeSort(leftArray, 0, leftArray.length - 1);
mergeSort(rightArray, 0, rightArray.length - 1);
getMerge(array, start, leftArray, rightArray); }
}
//根据judge获取数组array区间start~end的一半元素
public int[] getHalfArray(int[] array, int start, int end, int judge) {
int[] half;
int len = end - start + 1;
if(judge == 0) {
int length = len / 2;
half = new int[length];
for(int i = 0;i < length;i++)
half[i] = array[start + i];
} else {
int length = len - len / 2;
half = new int[length];
for(int i = 0;i < length;i++) {
half[i] = array[start + len / 2 + i];
}
}
return half;
}
//合并数组array的左半边元素和右半边元素,返回降序排列
public void getMerge(int[] array, int start, int[] leftArray, int[] rightArray) {
int i = 0, j = 0;
while(i < leftArray.length && j < rightArray.length) {
if(leftArray[i] >= rightArray[j])
array[start++] = leftArray[i++];
else
array[start++] = rightArray[j++];
}
while(i < leftArray.length) array[start++] = leftArray[i++];
while(j < rightArray.length) array[start++] = rightArray[j++];
} public void printResult(int[] array, int[][] query) {
int[] result = new int[query.length];
for(int i = 0;i < query.length;i++) {
int[] tempArray = new int[array.length]; //此处获取array的克隆对象,要求地址也要改变。若直接赋值,两者地址是一样
for(int j = 0;j < array.length;j++)
tempArray[j] = array[j];
int start = query[i][0];
int end = query[i][1];
int k = query[i][2];
if(k < 0 || k > end - start + 1) //防止k出界
continue;
mergeSort(tempArray, start - 1, end - 1);
result[i] = tempArray[start - 1 + k - 1];
}
//输出结果
for(int i = 0;i < result.length;i++)
System.out.println(result[i]);
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] array = new int[n];
for(int i = 0;i < array.length;i++)
array[i] = in.nextInt();
int m = in.nextInt();
if(n > 1000 || m > 1000)
return;
int[][] query = new int[m][3];
for(int i = 0;i < m;i++) {
query[i][0] = in.nextInt();
query[i][1] = in.nextInt();
query[i][2] = in.nextInt();
}
test.printResult(array, query);
}
}

算法笔记_079:蓝桥杯练习 区间k大数查询(Java)的更多相关文章

  1. 蓝桥杯ALGO-1,区间k大数查询

    #include<stdio.h> int devide(long a[], int low, int high) { long key = a[high]; while (low< ...

  2. 算法笔记_057:蓝桥杯练习 最大的算式 (Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就 ...

  3. 算法笔记_061:蓝桥杯练习 字串统计(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然 ...

  4. 算法笔记_123:蓝桥杯第七届省赛(Java语言B组部分习题)试题解答

     目录 1 凑算式 2 方格填数 3 四平方和   1 凑算式 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A ...

  5. 算法笔记_086:蓝桥杯练习 9-2 文本加密(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:"A"转化"B" ...

  6. 算法笔记_063:蓝桥杯练习 送分啦(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 这题想得分吗?想,请输出“yes”:不想,请输出“no”. 输出格式 输出包括一行,为“yes”或“no”. 2 解决方案 初步一看,这题 ...

  7. 试题 算法训练 区间k大数查询 java题解

    资源限制 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正 ...

  8. 蓝桥杯 算法训练 区间k大数查询(水题)

    算法训练 区间k大数查询 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. ...

  9. 蓝桥杯--算法训练 区间k大数查询

                                                                                 算法训练 区间k大数查询   时间限制:1.0 ...

随机推荐

  1. 洛谷P3901 数列找不同 [莫队]

    题目传送门 题目描述 现有数列 A_1,A_2,\cdots,A_NA1​,A2​,⋯,AN​ ,Q 个询问 (L_i,R_i)(Li​,Ri​) , A_{Li} ,A_{Li+1},\cdots, ...

  2. WeGame导致WSL无法监听端口问题

    Windows 10 系统自带Linux子系统(WSL),可以方便的使用WSL运行Linux程序和脚本.笔者在WSL上运行Redis时突然发现无法监听6379端口,尝试重新安装WSL无果. 后来重新安 ...

  3. 解决Linux用户模板文件被删除后显示不正常问题

    缺失用户模板文件(用户骨架文件)会导致shell提示符不完整,可以到/etc/skel/目录下复制相关文件来恢复 (1).创建测试环境,删除模板文件 [root@xuexi ~]# useradd t ...

  4. UGUI的优点新UI系统四 开源

    UGUI的优点新UI系统四 开源 新UI系统是开源的,所以开发者可以看到新UI系统实现的源码,并加以修改和使用. 开源授权协议——MIT/X11 Unity所搭载的新UI系统,是在开源授权协议MIT/ ...

  5. Codeforces Round #450 (Div. 2) ABCD

    这次还是能看的0 0,没出现一题掉分情况. QAQ前两次掉分还被hack了0 0,两行清泪. A. Find Extra One   You have n distinct points on a p ...

  6. [UOJ218]火车管理

    建一棵答案线段树存栈顶值,两棵可持久化线段树分别存栈顶值和栈顶元素入栈时间 询问就直接在答案线段树上查,弹栈就用入栈时间在对应版本的可持久化线段树上查询即可,修改就是可持久化线段树的区间覆盖 以前一直 ...

  7. List the Books

    描述 Jim is fond of reading books, and he has so many books that sometimes it's hard for him to manage ...

  8. Educational Codeforces Round 6 D. Professor GukiZ and Two Arrays 二分

    D. Professor GukiZ and Two Arrays 题目连接: http://www.codeforces.com/contest/620/problem/D Description ...

  9. location和history

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Bestreviewapp给iOS软件写评论赚钱

    BestReviewApp 这是一个评论类的活动,网站上会提供App列表,在iTunes评论这些应用就能获得报酬.目前账号中的余额可通过PayPal或支付宝提取出来.BestReviewApp 开放的 ...