计蒜客 难题题库 200 判断m是否为质数

给定一个长度为N(0< n< =10000)的序列,保证每一个序列中的数字a[i]是小于maxlongint的非负整数 ,编程要求求出整个序列中第k大的数字减去第k小的数字的值m,并判断m是否为质数。(0< k< =n)

输入格式: 

第一行为2个数n,k(含义如上题) 第二行为n个数,表示这个序列

输出格式: 

如果m为质数则 第一行为'YES'(没有引号),第二行为这个数m 

否则,第一行为'NO',第二行为这个数m(需要注意的是,最小的质数是2,如果小于2的话,请直接输出NO)

对于第K大的详细解释:
如果一个序列为1  2  2  2  3
那么第1大为3,第2大为2,第3大为2,第4大为2,第5大为1, 第K小与上例相反

样例1

输入:

5 2
1 2 3 4 5

输出:

YES
2


#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

bool isPrime(int n){
    if(n < 2){
        return 0;
    }
    if(n == 2){
        return 1;
    }
    for(int i = 2; i * i <= n; ++i){
        if(n % i == 0){
            return 0;
        }
    }
    return 1;
}

int main(){
    int n, k;
    cin >> n >> k;
    vector<int> vi;
    vi.resize(n);
    for(int i = 0; i < n; ++i){
        cin >> vi[i];
    }
    sort(vi.begin(), vi.end());
    int m = vi[n - k] - vi[k - 1];
    if(m < 2){
        cout << "NO" << endl;
        return 0;
    }
    if(isPrime(m)){
        cout << "YES" << endl;
    }else{
        cout << "NO" << endl;
    }
    cout << m << endl;
    return 0;
}


你可能感兴趣的:(OJ,计蒜客)