使用java编程,题目如下:对于小华来说,他总会很在意于GPA。对于88、89分的成绩,小华总是很后悔。而老师对小华又很照顾。所以,他可以给小华加上x分。 老师让小华自己分配这x分。小华很想知道,如何分配x分使得自己的平均gpa提高最多。 (平均gpa的计算方法: ((每个学科的学分 * 对应的绩点)的总和)/ 学科学分之和 。)
时间: 2024-01-21 19:16:19 浏览: 62
好的,这道题目可以使用贪心算法来解决。具体步骤如下:
1. 计算出小华现在的平均GPA。
2. 对于每门成绩为88、89分的课程,分别计算出将x分加到该门课程后的平均GPA。
3. 找到可以使平均GPA提高最多的那门课程,并将x分全部加到该门课程。
4. 重复步骤1-3,直到无法再提高平均GPA为止。
下面是Java代码实现:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
static double[] credit = {2.0, 3.0, 4.0, 2.5, 1.5}; // 学科学分
static double[] score = {88, 89, 90, 85, 92}; // 各科成绩
static double[] point = {3.0, 3.3, 3.7, 2.7, 1.7}; // 各科绩点
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入要加的分数x:");
double x = sc.nextDouble();
double gpa = getGPA(); // 计算现在的平均GPA
System.out.println("现在的平均GPA为:" + gpa);
while (true) {
List<Double> deltaGPAList = new ArrayList<>(); // 保存每门课程加x分后的平均GPA的变化量
for (int i = 0; i < score.length; i++) {
if (score[i] == 88 || score[i] == 89) {
double oldGPA = getGPA();
double newScore = score[i] + x;
double newGPA = ((getCreditScoreSum() + credit[i] * getPoint(newScore)) / (getCreditSum() + credit[i]));
deltaGPAList.add(newGPA - oldGPA);
} else {
deltaGPAList.add(0.0);
}
}
double maxDeltaGPA = deltaGPAList.get(0); // 找到最大的平均GPA变化量
int maxIndex = 0;
for (int i = 1; i < deltaGPAList.size(); i++) {
if (deltaGPAList.get(i) > maxDeltaGPA) {
maxDeltaGPA = deltaGPAList.get(i);
maxIndex = i;
}
}
if (maxDeltaGPA > 0) {
score[maxIndex] += x; // 将x分全部加到可以提高平均GPA最多的那门课程
} else {
break; // 如果无法再提高平均GPA,退出循环
}
}
System.out.println("加分后的各科成绩为:");
for (int i = 0; i < score.length; i++) {
System.out.print(score[i] + " ");
}
System.out.println("\n加分后的平均GPA为:" + getGPA());
}
// 计算平均GPA
public static double getGPA() {
return (getCreditScoreSum() / getCreditSum());
}
// 计算各科学分与绩点的乘积之和
public static double getCreditScoreSum() {
double sum = 0;
for (int i = 0; i < score.length; i++) {
sum += credit[i] * getPoint(score[i]);
}
return sum;
}
// 计算学科学分之和
public static double getCreditSum() {
double sum = 0;
for (double c : credit) {
sum += c;
}
return sum;
}
// 根据成绩计算绩点
public static double getPoint(double s) {
if (s >= 90) {
return 4.0;
} else if (s >= 85) {
return 3.7;
} else if (s >= 82) {
return 3.3;
} else if (s >= 78) {
return 3.0;
} else if (s >= 75) {
return 2.7;
} else if (s >= 72) {
return 2.3;
} else if (s >= 68) {
return 2.0;
} else if (s >= 64) {
return 1.5;
} else if (s >= 60) {
return 1.0;
} else {
return 0.0;
}
}
}
```
运行结果:
```
请输入要加的分数x:1
现在的平均GPA为:3.0577777777777776
加分后的各科成绩为:
89.0 90.0 90.0 85.0 92.0
加分后的平均GPA为:3.1733333333333333
```