最小值
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;
//}
相关文章推荐
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 数据结构之Treap详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)
- java数据结构和算法学习之汉诺塔示例
- Java数据结构及算法实例:三角数字
- Java数据结构之简单链表的定义与实现方法示例
- 数据结构之AVL树详解
- qqwry.dat的数据结构图文解释第1/2页
- JavaScript中数据结构与算法(五):经典KMP算法