zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    让delphi2010能有delphi7的版面布局
    多线程的基本概念和Delphi线程对象Tthread介绍
    Delphi编写后台监控软件
    delphi 2010是动画GIF的支持方法
    delphi 资源文件详解
    delphi 基础之四 delphi 组织结构
    delphi 基础之三 编写和调用dll文件
    delphi 基础之三 文件流操作
    mysql (5.7版本)---的配置
    session--保持登录20分钟,常用与用户登录状态
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6753033.html
Copyright © 2011-2022 走看看