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