您的位置:首页 > 理论基础 > 数据结构算法

最小值

2015-09-19 10:39 260 查看


最小值

时间限制:1000 ms  |  内存限制:65535 KB
难度:3

描述
输入N个数,M次查询。

每次查询给出一个数x。

 

要求:每次查询输出前x个数中第i小的数。(i为第i次查询)

你可以假设M  <= N,Xi
<= Xi+1 <= Xi+2 <= ……. <= Xm (Xm <= N).

输入Line0:T

Line1: N,M

Line2…LineN+1:num1,......,numN

LineN+2…LineN+2+M:x1,……,xM

N < 30000, num < 2000000000

输出每次查询输出前i小的数,单独一行。

详细格式请参考样例。
样例输入
1
7 4
3 1 -4 2 8 -1000 2
1 2 6 6


样例输出
3
3
1
2


来源STL
上传者
ACM_钟诗俊

AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define T 30005
int a[T];
int main()
{
/*freopen("input.txt","r",stdin);*/
int N,n,m,i,j,k;
scanf("%d",&N);
while(N--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;++i)
scanf("%d",&a[i]);
for(i=0;i<m;++i)
{
scanf("%d",&k);
sort(a,a+k);
printf("%d\n",a[i]);
}
}
return 0;
}

优秀代码:

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 30000 + 10;
int num[MAXN];
int n,m;
priority_queue<int> big;
priority_queue<int,vector<int>,greater<int> >small;
void solve(){
int cnt = 1,x;

while(!big.empty())big.pop();
while(!small.empty())small.pop();

for(int i = 1;i <= m; ++i){
scanf("%d",&x);
while(cnt <= x){ //遍历前x个数
small.push(num[cnt]);
if(!big.empty()&&big.top() > small.top()){
int t = big.top();
big.pop();
big.push(small.top());
small.pop();
small.push(t);
}
cnt++;
}
printf("%d\n",small.top()); //第i个最小值
big.push(small.top());
small.pop(); //保证big中是前i-1个最小值
}
}
int main()
{
// freopen("In.txt","r",stdin);
// freopen("Out.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; ++i){
scanf("%d",&num[i]);
}
solve();
}
return 0;
}

//#include <iostream>
//#include <algorithm>
//#include <cstdio>
//#include <cstring>
//#include <cstdlib>
//
//const int MAXN = 30000 + 10;
//int num[MAXN];
//int main()
//{
// freopen("In.txt","w",stdout);
//
// int n,m,T = 20;
// while(T--){
// n = rand()%20000 + 10;
// m = rand()%n + 1;
// printf("%d %d\n",n,m);
// for(int i = 0;i < n;++i){
// int x = rand()%20000000;
// printf("%d ",x);
// }
// printf("\n");
// for(int i = 0;i < m;++i){
// num[i] = rand() % n + 1;
// }
// std::sort(num,num+m);
// for(int i = 0;i < m;++i){
// printf("%d ",num[i]);
// }
// printf("\n");
// }
// return 0;
//}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构