P1001 K极值

时间: 1000ms / 空间: 131072KiB / Java类名: Main

背景

成成第一次模拟赛 第一道

描述

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

输入格式

输入格式:

第一行为2个数nk(含义如上题)

第二行为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

原创……

-------------------------------------------------

刚开始打了一个素数表,  结果提示Runtime Error ,就通过了几组数据。。

    然后改方法直接判断是不是素数了。。。。

-------------------------------------------------------------------------------------------

import java.util.Arrays;
import java.util.Scanner;
public class Main {

    static boolean is_prime(int n){
        if(n<=1) return false;
        if (n==2)return true;
         for(int i=3;i<=Math.sqrt(n);i++){
             if(n%i==0) return false;
         }
         return true;
        
        
    }
    

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            
        
            int a[]=new int[n];
            int k=sc.nextInt();
            for(int i=0;i<n;i++)
                a[i]=sc.nextInt();
            Arrays.sort(a);
            int tmp=a[k-1];
            int tmp1=a[n-k];
            if(tmp1-tmp<=1){
                System.out.println("NO");
            }
            else{
            if(is_prime(tmp1-tmp))
                System.out.println("YES");
            else
            System.out.println("NO");
            
            }
            System.out.println(tmp1-tmp);
        }
        sc.close();

    }

}