华为OJ:素数对个数

素数对个数

题目描述
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的N(N为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。

输入:

有一个正偶数N(N≤100),表示待挑选的自然数的个数。后面给出具体的数字,范围为[2,30000]。

输出:

输出一个整数K,表示你求得的“最佳方案”组成“素数伴侣”的对数。

输入描述:

输入说明
1 输入一个正偶数n
2 输入n个整数

输出描述:

求得的“最佳方案”组成“素数伴侣”的对数。

输入例子:
4
2 5 6 13
输出例子:
2解题理解不透
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        while(sc.hasNext()){
            int length = sc.nextInt();
            int[] in_num = new int[length];
            for(int i =0;i<length;i++){
                in_num[i] = sc.nextInt();
            }
            int max_count = getNumOfPrime(in_num);
            System.out.println(max_count);
        }

        sc.close();
    }

    private static  boolean isPrime(int num){
        for(int i = 2;i<=Math.sqrt(num);i++){
            if(num%i == 0){
                return false;
            }
        }
        return true;
    }

    private static int getNumOfPrime(int[] in_num){
        int length = in_num.length;
        int[] dp = new int[length+1];
        for(int i = 0;i<dp.length;i++){
            dp[i] = 0;
        }
        int count = 0;
        for(int j = length-2;j>=0;j--){
            for(int k = length-1;k>j;k--){
                if(isPrime(in_num[j]+in_num[k])){
                    count = dp[j+1]-dp[k-1]+dp[k+1]+1;
                }
                else{
                    count = dp[j+1];
                }

                if(count>dp[j]){
                     dp[j] = count;
                }
            }
        }
        return dp[0];
    }

}
 
时间: 2024-10-01 07:19:32

华为OJ:素数对个数的相关文章

华为OJ:查找输入整数二进制中1的个数

不得不说这道题就是一道十分蛋疼的题,我本来想着对输入的整数K对1按位与运算,然后再将K向右移一位,循环这样做,知道K为0. 万万没想到,程序一直超时,莫名其妙,看讨论上说是因为这编译器高位补零,还能不能再坑一点. import java.util.Scanner; public class binarySystemOneNumber { public static int findNumberOf1(int k){ int count=0; int num=1; for(int i=1;i<=I

【华为OJ】【056-统计大写字母个数】

[华为OJ][算法总篇章] [华为OJ][056-统计大写字母个数] [工程下载] 题目描述 找出给定字符串中大写字符(即'A'-'Z')的个数 接口说明 原型:int calcCapital(String str); 返回值:int 输入描述 输入一个String数据 输出描述 输出string中大写字母的个数 输入例子 add123#$%#%#O 输出例子 1 算法实现 import java.util.Scanner; /** * Author: 王俊超 * Date: 2015-12-2

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

【华为OJ】【094-多线程】

[华为OJ][算法总篇章] [华为OJ][094-多线程] [工程下载] 题目描述 问题描述:有4个线程和1个公共的字符数组.线程1的功能就是向数组输出A,线程2的功能就是向字符输出B, 线程3的功能就是向数组输出C,线程4的功能就是向数组输出D.要求按顺序向数组赋值ABCDABCDABCD, ABCD的个数由线程函数1的参数指定. 输入描述: 输入一个int整数 输出描述: 输出多个ABCD 输入例子: 10 输出例子: ABCDABCDABCDABCDABCDABCDABCDABCDABCD

【华为OJ】【091-数据分类处理】

[华为OJ][算法总篇章] [华为OJ][091-数据分类处理] [工程下载] 题目描述 信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码.QQ用户.手机号码.银行帐号等信息及活动记录. 采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出. 输入描述: ?一组输入整数序列I和一组规则整数序列R,I和R序列的第一个整数为序列的个数(个数不包含第一个整数):整数范围为0~0xFFFFFFFF,序列个数不限 输出描述: ?从R依次中取出R<i>,对I进行处理,找到满足条件

【华为OJ】【084-求最大连续bit数】

[华为OJ][算法总篇章] [华为OJ][084-求最大连续bit数] [工程下载] 题目描述 功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字 输出: 无 返回: 对应的二进制数字中1的最大连续数 输入描述 输入一个byte数字 输出描述 输出转成二进制之后连续1的个数 输入例子 3 输出例子 2 算法实现 import java.util.Scanner; /** * Author: 王俊超 * Dat

华为OJ:2041 放苹果

这道题难点不在于代码怎么写,而是思路怎么想.感觉一般这种题要么你理好一个思路要么你最后总结出一个公式,要么你自己模拟它的运作方式,用迭代,或者递归的方式来做.有点像我们以前学的排列组合. 对于m个苹果,n个盘子f(m,n),如果苹果个数比盘子少,那么就跟n个盘子,n个苹果是一样的f(n,n).如果m比n大,那么有两种情况,一种有空盘子的情况,一种没有空盘子的情况,两种情况不重叠且加一起一定为情况总数.第一种情况就即为n个盘子放在m-1个盘子里,因为至少有个空盘子.f(m,n-1),第二种情况下,

华为OJ—火车进站(栈,字典排序)

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号.其实也就是输出所有可能的出栈序列. 样例输入: 3 1 2 3 样例输出: 1 2 31 3 22 1 32 3 13 2 1 解答: 其实核心就是一个栈,对于第K个数,在第K个数进栈之前,前面的 K-1 个数要么全部出去了,要么都在栈里面,要么部分在栈里面部分出去了.那么可以假想,在第K个数入栈之前,依次从栈里面出去 0个.1个.2个--栈.si

【华为OJ】【076-蛇形矩阵】

[华为OJ][算法总篇章] [华为OJ][076-蛇形矩阵] [工程下载] 题目描述 题目说明 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形. 样例输入 5 样例输出 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 输入描述 输入正整数N(N不大于100) 输出描述 输出一个N行的蛇形矩阵. 输入例子 4 输出例子 1 3 6 10 2 5 9 4 8 7 算法实现 import java.util.Scanner; /** * Author: 王俊超 * Da