题面 –>
时间: 1000ms / 空间: 131072KiB / Java类名: Main
背景
成成第一次模拟赛 第一道
描述
给定一个长度为N(0<n<=10000)的序列,保证每一个序列中的数字a[i]是小于maxlongint的非负整数,编程要求求出整个序列中第k大的数字减去第k小的数字的值m,并判断m是否为质数。(0<k<=n)
输入格式:
第一行为2个数n,k(含义如上题)
第二行为n个数,表示这个序列
输出格式:
如果m为质数则
第一行为'YES'(没有引号)
第二行为这个数m
否则
第一行为'NO'
第二行为这个数m
测试样例1
输入
5 2
1 2 3 4 5
输出
YES
2
备注
对于第K大的详细解释:
如果一个序列为1 2 2 2 2 3
第1大 为3
第2大 为2
第3大 为2
第4大 为2
第5大 为1
第K小与上例相反
另外需要注意的是
最小的质数是2,如果小于2的话,请直接输出NO。
分析 –>
不解释
代码 –>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
long long num[11000];
bool ss(long long m)
{
if(m < 2)
return false;
if(m == 2)
return true;
for(int i = 2; i <= sqrt(m); i ++)
{
if(m % i == 0)
return false;
}
return true;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i = 1; i <= n; i ++)
scanf("%lld",&num[i]);
sort(num + 1, num + n + 1);
long long m = num[n - k + 1] - num[k];
if(ss(m))
printf("YES\n%lld",m);
else printf("NO\n%lld",m);
return 0;
}