【編程題】科大訊飛 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個素數是多少?

輸入:第一行一個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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章