【编程题】科大讯飞 2018校招 在线笔试题 题解

2018科大讯飞校招在线笔试题题解


1.分糖果

题目描述:小明和小红是好朋友,但最近遇到一个棘手的问题,有一盒糖果要分成两份,但是每颗糖果质量都不尽相同,但为了分配公平每份糖的糖果数量相差不得超过1,在此条件下两份糖果的质量差距尽可能小。

输入:每行包含一个数n,表示糖果数量,后面依次是n个整数依次表示每个糖果的质量,每个糖果的质量都是1之450之间的一个整数,每盒最多有20个糖果。

输出:每个样例输出两个数字,分别为两堆糖果的质量,如不相同,先小后大。

样例输入:5  9  6  5  8  7

样例输出:17 18

解题思路:

使用暴力搜索法,假设糖果数目是n,则分成两份的数量分别是n/2和n-n/2。这是一个组合问题:如何在n个糖果中选n/2个糖果,使得选出的糖果和剩余的糖果的质量只差最小?

因此,只要搜索所有的C(n,n/2)种分糖方法,就能找出差值最小的那种。

这里需要用到几个参数,其中weight表示当搜索到这一步的时候,已经选出来的糖果的总质量;start表示“决定要不要选”的那个糖果的编号;count表示已经选出的糖果的数量,如果count到达了n/2,表明搜索到一种分法,可以进行比较了。res表示“当前搜索过的所有分法中最好的分法”,当搜索完成后,就是结果;target表示糖果的总质量的一半,gap表示“当前搜索过的所有分法中最好的分法与target的差值”,即分法好坏的依据。

代码展示:

import java.util.Scanner;

public class Candy {
    static int res, gap, target, n, sum;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        int[] sugers = new int[n];
        for (int i = 0; i < n; i++) {
            sugers[i] = sc.nextInt();
            sum += sugers[i];
        }
        target = sum / 2;
        res = 0;
        gap = Integer.MAX_VALUE;
        search(sugers, 0, 0, 0);
        if (res > sum - res)
            System.out.println(sum - res + " " + res);
        else
            System.out.println(res + " " + (sum - res));
    }

    public static void search(int[] sugers, int weight, int index, int count) {
        if (count == n / 2) {
            if (gap > Math.abs(sum - 2 * weight)) {
                res = weight;
                gap = Math.abs(2 * weight - sum);
            }
        } else {
            if (index < sugers.length) {
                search(sugers, weight, index + 1, count);
                search(sugers, weight + sugers[index], index + 1, count + 1);
            }
        }
    }
}

2.素数

题目描述:小红非常喜欢素数。现有q组数(均为1,2,3,4,...,N)。她想知道针对每一组,第k个素数是多少?

扫描二维码关注公众号,回复: 10748964 查看本文章

输入:第一行一个q,表示组数;接下来q行,每行一个整数k,表示向红想知道第k个素数是多少。满足1<=q<=100000,1<=k<=100000

输出:输出q行,每行输出一个答案。

样例输入

    2

    1

    3

样例输出

    2

    5

备注:输出样例第一行,输出一个素数为2;输出样例第二行,输出一个素数为5.

解题思路

令max表示输入的q个数字中最大的数字,找到从1开始的max个素数并用数组存储。最后遍历数组中与输入的q个数字对应的素数即可。

代码展示

import java.util.Arrays;
import java.util.Scanner;

public class PrimeNumber {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        if (n > 0) {
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = sc.nextInt();
            }
            getPrime(arr, n);
        }
    }

    private static void getPrime(int[] arr, int n) {
        int max = Arrays.stream(arr).max().getAsInt();
        int[] prime = new int[max];
        int x = 1, i = 0;
        for (; ; x++) {
            if (i < prime.length) {
                if (isPrime(x)) {
                    prime[i] = x;
                    i++;
                }
            } else {
                break;
            }
        }
        for (int p = 0; p < arr.length; p++) {
            System.out.println(prime[arr[p] - 1]);
        }
    }

    private static boolean isPrime(int x) {
        if (x == 1 || x % 2 == 0 && x != 2) {
            return false;
        } else {
            for (int i = 3; i < Math.sqrt(x); i += 2) {
                if (x % i == 0) {
                    return false;
                }
            }
        }
        return true;
    }
}
发布了279 篇原创文章 · 获赞 169 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/ARPOSPF/article/details/80556610
今日推荐