第K极值
题目
Description
数据说明:给定一个长度为N(0<n<=10000)的序列,保证每一个序列中的数字a[i]是小于maxlongint的非负整数 .
编程要求:求出整个序列中第k大的数字减去第k小的数字的值m,并判断m是否为质数。(0<k<=n)
Input
第一行为2个数n,k(含义如上题)
第二行为n个数,表示这个序列
Output
如果m为质数则
第一行为'YES'(没有引号)
第二行为这个数m
否则
第一行为'NO'
第二行为这个数m
Sample Input
5 2
1 2 3 4 5
Sample Output
YES
2
Hint
对于第K大的详细解释:
如果一个序列为1 2 2 2 3
第1大 为3
第2大 为2
第3大 为2
第4大 为2
第5大 为1
第K小与上例相反
另外需要注意的是
最小的质数是2,如果小于2的话,请直接输出NO
Source
第三届海润杯上海第二工业大学新生程序设计竞赛
说明
使用了c++的sort函数来进行排序,因此需要注意的是第k大和第k小在数组中位置的下标。
代码(及解释)
#include<bits/stdc++.h>
using namespace std;
int pd(long long m)//自定义函数来判断是否为素数
{
if(m<2) return 0;//如果小于2,那必不是素数
else
for(int i=2;i<=sqrt(m);i++){//最简单的方法判断,缩小i的范围来节省时间
if((m%i)==0) return 0;
}
return 1;
}
int main(void)
{
int n,k;
long long m;
cin>>n>>k;
long long a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);//sort函数默认从小到大排序
m=a[n-k]-a[k-1];
//第k大:数组最后一个下标n-1是第一大,因此为n-k即可;
//第k小;数组第一个下标为0,因此为k-1;
if(pd(m)==1)
{
cout<<"YES"<<endl;
cout<<m;
return 0;
}
else
{
cout<<"NO"<<endl;
cout<<m;
return 0;
}
}