您的位置:首页 > 其它

【Tyvj P1001】第K极值

2016-08-05 08:26 211 查看
P1001 第K极值

时间: 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

。。

排个序减一下判一下

一句话的题解QAQ

需要注意的题目里都说了

1不是质数不是合数

2是唯一的偶质数

代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 200005;
int n,m,k,t,num[MAXN];

int main(){
memset(num,0,sizeof(num));
scanf("%d %d",&n,&k);
for(int i = 1;i <= n;i ++)    scanf("%d",&num[i]);
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n - i;j ++)
if(num[j] < num[j + 1]) swap(num[j],num[j + 1]);
m = num[k] - num[n - k + 1];

if(m == 2)   printf("YES\n%d\n",m);
else if(m > 2)
for(int i = 2;i <= m / 2 + 1;i ++){
if(m % i == 0) {printf("NO\n%d\n",m);return 0;}
if(i == m / 2 + 1) printf("YES\n%d\n",m);
}
else    printf("NO\n%d\n",m);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: