思路:求第k大及第k小的数,并没有什么朴素的判断方法。于是我们考虑将这组数先变为有序再进行直接筛选,然后朴素判断即可。算法复杂度为O(nlogn);
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int a[10001];
int prim(int n)//简单判断素数
{
if (n<2) return 0;//若小于2直接返回0
for(int i=2;i<=(int)(sqrt(n));i++)
{
if (n%i==0) return 0;
}
return 1;
}
int main ()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];//将未排序的数存入数组
}
sort(a,a+n);//快排
int l=a[k-1];//第k小的数
int r=a[n-k];//第k大的数
if (prim(r-l))
{
cout<<"YES"<<endl;
cout<<r-l;
}
else
{
cout<<"NO"<<endl;
cout<<r-l;
}
return 0;
}