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;
}
}