NYOJ 1073 最大值 (模拟)

题目链接

输入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

分析:

最开始不能一下子理解这个第i小的含义,其实就是前x个元素按照从小到大的顺序排列过之后再第i个位置上的元素。还有就是输入的x是一个不递减的序列,这样也就意味着我们下一次的sort排序可以在上次的基础上,否则的话这次排完序就回应下下次排序的结果,就不会这么容易了。

代码:

#include <iostream>
#include <cstdio>
#include <vector>
#include<algorithm>
using namespace std;
int a[30009];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        a[0]=-0x3f3f3f3f;///a数组要从小到大排序,所以要让第一个元素是最小的
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
        }
        int x;
        for(int i=1; i<=m; i++)
        {
            scanf("%d",&x);///之所以能够这样用,是因为x是一个不递减的序列
            // if(x>n)
            //   x=n;
            sort(a,a+x+1);
            printf("%d
",a[i]);
        }
    }
    return 0;
}

然后还有一种用vector容器写的,思路是一样的,但是要比数组的sort排序省很多的时间。调用nth_element(v.begin(),v.begin()+n v.begin()+a)函数,函数的功能就是将数组中第n大的元素放到第n个位置。

具体看代码吧!

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        vector <int>v;
        for(int i=0; i<n; i++)
        {
            int a;
            scanf("%d",&a);
            v.push_back(a);
        }
        for(int i=1; i<=m; i++)
        {
            int a;
            scanf("%d",&a);
            nth_element(v.begin(),v.begin()+i-1, v.begin()+a);
            cout<<v[i-1]<<endl;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/cmmdc/p/6753033.html