最小值

来源:互联网 发布:无线键盘推荐 知乎 编辑:程序博客网 时间:2024/05/22 19:04

最小值
时间限制: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

分析:
在状态不好的时候想写写水题放松一下。一看难度为三就选了这题。结果被坑了。。。
方法一:没有看到你可以假设M <= N,Xi <= Xi+1 <= Xi+2 <= ……. <= Xm (Xm <= N).这个条件,认为x的顺序可以任意。所以为了节约一点时间就想到了用快排的思想求第k小值。辅助数组p[]保存0~x-1的值。(很费时间,可以想下其他方法)。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 30010;int a[maxn];int p[maxn];int mypartion(int x,int y){    int i=x,j=y,t;    while(i<j)    {        while(i<j)        {            if(p[j]>=p[i])                j--;        }        if(i<j)        {            t=p[i];            p[i]=p[j];            p[j]=t;            i++;        }        while(i<j)        {            if(p[i]<=p[j])                i++;        }        if(i<j)        {            t=p[i];            p[i]=p[j];            p[j]=t;            j--;        }    }    return i;}int ksort(int x,int y,int k){    int middle = mypartion(x,y);    if(middle==k)        return p[middle];    else if(middle<k)    {        return ksort(middle+1,y,k);    }    else        return ksort(x,middle-1,k);}int main(){    freopen("input.in","r",stdin);    int t,n,m,x;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(int i=0;i<n;i++)            scanf("%d",&a[i]);        for(int i=0;i<m;i++)        {            scanf("%d",&x);            for(int j=0;j<x;j++)                p[j]=a[j];            int ans =ksort(0,x-1,i);            printf("%d\n",ans);        }    }    return 0;}

方法2:看到你可以假设M <= N,Xi <= Xi+1 <= Xi+2 <= ……. <= Xm (Xm <= N).这个条件后,前面顺序被更改不影响后面的查询,所以每次可以直接sort()然后输出第i个就可以了。

#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;const int maxn = 30010;int a[maxn],b;int main(){    int t,n,m;    scanf("%d",&t);    while(t    {        scanf("%d%d",&n,&m);        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        for(int i=1;i<=m;i++)        {            scanf("%d",&b);            sort(a+1,a+b+1);            printf("%d\n",a[i]);        }    }    return 0;}
1 0
原创粉丝点击