区间第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
样例输出
42
数据规模与约定
对于 30%的数据, n,m<=100;
对于 100%的数据, n,m<=1000;
保证 k<=(r-l+1) ,序列中的数<=106。


#include<stdio.h>
#include<stdlib.h>

void Copy(int *a, int *tmp, int l, int n)
{
    int i;
	for(i=0; i<n; i++)
		tmp[i] = a[l++];
}

void QuickSort(int *tmp, int low, int high)
{
	int value, i, j;
	if(low < high)
	{
		value = tmp[low], i = low, j = high - 1;
		while(i < j)
		{
			while(tmp[j] >= value && i < j)
				j--;
			tmp[i] = tmp[j];
			while(tmp[i] <= value && i < j)
				i++;
			tmp[j] = tmp[i];
		}
		tmp[i] = value;
		QuickSort(tmp, low, i-1);
		QuickSort(tmp, i+1, high);
	}
}

void Find_k(int *tmp, int n, int k)
{
	while(k--)
		n--;
	printf("%d\n", tmp[n]);
}

int main()
{
	int n, m, i, l, r, k, *a = NULL, *tmp;

	scanf("%d", &n);
	a = (int *)malloc(sizeof(int) * n);
	for(i=0; i<n; i++)
		scanf("%d", &a[i]);
	scanf("%d", &m);

	while(m--)
	{
		scanf("%d%d%d", &l, &r, &k);
		l--; r--;						//l和r代表第几个数,分别-1就成了数组下标
		n = r - l + 1;					//tmp的长度
		tmp = (int *)malloc(sizeof(int) * n);
		Copy(a, tmp, l, n);
		QuickSort(tmp, 0, n);
		Find_k(tmp, n, k);
	}
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值