2022年第四届全国高校计算机能力挑战赛决赛(java)
个人解答源码及思路,非评分标准答案。
1.在光华集团的一次团建活动中,团建服务公司为光华集团员工设计了一系列
闯关游戏,其中有一个关卡是要开启一个神秘通道,要开启神秘通道,游戏参与者需要答对一道题,题目是这样描述的:一个天平的一端放置了重量为N千克的物品,另一端是空的,现在天平旁边放了M个沙袋,其重量各不相同,现在要从M个沙袋中选出若干袋放到天平空的一端上,使天平两端刚好平衡,这样才能开启神秘通道,问有多少种选择沙袋的组合方法。这个问题把光华集团的员工难住了,请你编程序帮助游戏参与者找到正确答案。
输入说明:
第一行输入两个正整数N和M,N表示天平一端已经放置的物品重量(N<=1000,单位为千克),M表示沙袋数量(M<=50);第二行输入M个以空格分隔的正整数,表示M个沙袋的重量(每个沙袋的重量不超过100千克,M个沙袋重量各不相同)。
输出说明:
输出一个整数,表示选择若干沙袋使其总重量为N的不同组合方法的数量。
输入样例1:
12 4
2 5 7 3
输出样例1:
2
输入样例2:
20 5
4 2 11 3 9
输出样例2:
2
参考源码:
1. import java.util.Scanner;
2. public class FristProblemFinal {
3. public static void main(String[] args) {
4. Scanner sc = new Scanner(System.in);
5. int N = sc.nextInt();
6. int M = sc.nextInt();
7. int[] array = new int[M];
8. for (int i = 0; i < M; i++) {
9. array[i] = sc.nextInt();
10. }
11. System.out.println(CalSum(array, N));
12. }
13.
14. static int CalSum(int[] array, int result) {
15. int numberCombinations = 0;
16. for (int i = 1; i < 1 << array.length; i++) {
17. int sum = 0;
18. for (int j = 0; j < array.length; j++) {
19. if ((i & 1 << j) != 0) {
20. sum += array[j];
21. }
22. }
23. if (sum == result) {
24. numberCombinations++;
25. }
26. }
27. return numberCombinations;
28. }
29. }
算法思路:
对于M个沙袋,用M位的二进制数来表示,对应的数从1到2M-1(000…1到1111),某位为1,表示当前沙袋被选中。以M=3为例,001表示选中第1个沙袋,010表示选中第2个沙袋,011表示选中第1个沙袋和第2个沙袋,以此类推。将选中的沙袋重量之和与物品重点进行比较,相等则为符合要求的一种组合方式。
运行截图:
测试用例1(题目输入样例1)
测试用例2(题目输入样例2)
测试用例3
2. 临近期末,华园各种课程面临期末考试,为了更准确地了解学生对课程的掌握情况,需要对各班成绩进行统计分析,具体包括:计算班级成绩的平均分和标准差,统计各个分数段(A:[90,100],B:[81,89],C:[71,80],D:[61,70],E:[0,60])的人数及所占比例。请编写程序,根据输入的某班级某门课的成绩,计算并输出其各种统计信息。
标准差计算公式如下:
输入说明:
第一行输入正整数N,表示班级人数。
第二行输入每位同学的分数。
输出说明:
第一行输出班级平均成绩(保留到小数点后2位)和成绩的标准差(保留到小数点后2位),中间用空格隔开。
第二行起输出各个分数段的人数及占比,每个分数段占一行格式为:等级:人数占比。等级用A~E的字母表示,占比保留到小数点后两位。
输入样例1:
20
65 78 69 90 87 75 100 94 45 70 73 75 85 69 54 88 60 72 73 82
输出样例1:
75.20 13.16
A:3 15.00%
B:4 20.00%
C:6 30.00%
D:4 20.00%
E:3 15.00%
输入样例2:
15
67 80 78 64 90 85 76 56 92 90 86 78 76 85 69
输出样例2:
78.13 10.13
A:3 20.00%
B:3 20.00%
C:5 33.33%
D:3 20.00%
E:1 6.67%
参考源码:
1. import java.text.DecimalFormat;
2. import java.util.Scanner;
3. @SuppressWarnings("ALL")
4. public class SecondProblemFinal {
5. public static void main(String[] args) {
6. Scanner sc = new Scanner(System.in);
7. int[] fiveLevels = new int[5];
8. int N = sc.nextInt();
9. int[] eachScrores = new int[N];
10. int totalScores = 0;
11. for (int i = 0; i < N; i++) {
12. int currentScore = sc.nextInt();
13. totalScores += currentScore;
14. eachScrores[i] = currentScore;
15. if (currentScore >= 90) {
16. fiveLevels[0]++;
17. continue;
18. }
19. if (currentScore >= 81) {
20. fiveLevels[1]++;
21. continue;
22. }
23. if (currentScore >= 71) {
24.
25. fiveLevels[2]++;
26. continue;
27. }
28. if (currentScore >= 61) {
29. fiveLevels[3]++;
30. continue;
31. }
32. if (currentScore >= 0) {
33. fiveLevels[4]++;
34. continue;
35. }
36. }
37. double averageScore = totalScores * 1.0 / N;
38. double temp = 0;
39. for (int i = 0; i < N; i++) {
40. temp = temp + (eachScrores[i] - averageScore) * (eachScrores[i] - averageScore);
41. }
42. temp = temp / N;
43. double variance = Math.sqrt(temp);
44. double levelA = fiveLevels[0] * 1.0 / N ;
45. double levelB = fiveLevels[1] * 1.0 / N ;
46. double levelC = fiveLevels[2] * 1.0 / N ;
47. double levelD = fiveLevels[3] * 1.0 / N ;
48. double levelE = fiveLevels[4] * 1.0 / N ;
49. DecimalFormat df1 = new DecimalFormat("0.00");
50. DecimalFormat df2 = new DecimalFormat("0.00%");
51. System.out.println(df1.format(averageScore) + " " + df1.format(variance));
52. System.out.println("A:" + fiveLevels[0] + " " + df2.format(levelA) + "%");
53. System.out.println("B:" + fiveLevels[1] + " " + df2.format(levelB) + "%");
54. System.out.println("C:" + fiveLevels[2] + " " + df2.format(levelC) + "%");
55. System.out.println("D:" + fiveLevels[3] + " " + df2.format(levelD) + "%");
56. System.out.println("E:" + fiveLevels[4] + " " + df2.format(levelE) + "%");
57. }
58. }
算法思路:
模拟算法。有一处需要特别注意,题目设置的分数等级(五级制)判断标准与我们通常采用的标准不完全相同。(具体原因不知)
我们通常的五级制标准是:A:[90,100],B:[80,89],C:[70