乐振翔


私信TA

用户名:lezhenxiang

访问量:366

签 名:

等  级
排  名 36429
经  验 420
参赛次数 1
文章发表 2
年  龄 0
在职情况 学生
学  校 万江中心小学
专  业

  自我简介:

TA的其他文章

  由题目可推导出要达到满分要做两件事:

  (1):从“求出整个序列中第k大的数字减去第k小的数字的值m”我们可以知道我们应该先对该输入序列做一个排序,而快排是最好的选择,因此我们可以这么做:

    ①插入头文件:#include<algorithm>

    ②建立排序函数:

    bool kp(int a,int b)

    {

          return a<b;

     }//(我的目的是让所有人都能看懂,不要说我不建自定义快排函数)

     ③在主函数的输入部分后插入sort(a,a+n,kp);// 第②步可省略,但此行要改成sort(a,a+n);

     ④求m值

     排序过后,我们将得到一个有序的数列,此时再寻找“第k大的数字”和“第k小的数字”就十分容易了。具体思路如下:

     就以样例输入为例子:

     5 2
     1 2 3 4 5

     排序后数列仍是

     1 2 3 4 5

     我们将其的数组下标代入:

     1 2 3 4 5

     0 1 2 3 4(下标)

     通过观察可知,“第k小的数字”就是a[k-1],而“第k大的数字”就是a[n-k]。

     由此可得m值,第一件事就做好了。

     (2):判断m是否为质数。

      这个就没必要说了吧!代码如下:

     int ss(int n)

     {

        int i=2;

        if(n<=1) return 0;

        for(i=2;i<=sqrt(n);i++)

        {

              if(n%i==0) return 0;

         }

          return 1;

       }

       再把两段代码合并可得答案:

       

#include<iostream>

#include<algorithm>

#include<math.h>

using namespace std;

int ss(int n)

{

    int i=2;

    if(n<=1) return 0;

    for(i=2;i<=sqrt(n);i++)

    {

        if(n%i==0) return 0;

    }

    return 1;

}

int main()

{

    int n,i,k;

    cin>>n>>k;

    int a[n+1]={0};

    for(i=0;i<n;i++) cin>>a[i];

    sort(a,a+n);

    if(ss(a[n-k]-a[k-1])==0) cout<<"NO"<<endl<<a[n-k]-a[k-1];

    else cout<<"YES"<<endl<<a[n-k]-a[k-1];

    return 0;

}


 

0.0分

0 人评分

  评论区

  • «
  • »