题目描述
北京大学对本科生的成绩施行平均学分绩点制(GPA
)。
即将学生的实际考分根据不同的学科的不同学分按一定的公式进行计算。
公式如下:
实际成绩 绩点
90——100 4.0
85——89 3.7
82——84 3.3
78——81 3.0
75——77 2.7
72——74 2.3
68——71 2.0
64——67 1.5
60——63 1.0
60以下 0
一门课程的学分绩点 = 该课绩点 $\times$ 该课学分
总评绩点 = 所有学科学分绩点之和 / 所有课程学分之和
现要求你编写程序求出某人 $A$ 的总评绩点(GPA
)。
输入格式
第一行,总的课程数 $n$;
第二行,相应课程的学分(两个学分间用空格隔开);
第三行,对应课程的实际得分;
此处输入的所有数字均为整数。
输出格式
输出有一行,总评绩点,精确到小数点后 $2$ 位小数。
数据范围
$1 \le n \le 10,$
学分取值范围 $[1, 10],$
课程得分范围 $[0,100]$。
输入样例:
5
4 3 4 2 3
91 88 72 69 56
输出样例:
2.52
解题思路
由于 GPA
等于总绩点除以总学分,我们考虑分别把这两块算出来。
设 $a _ i$ 为第 $i$ 门课程的学分,$c _ i$ 为第 $i$ 门课程的实际得分,记 $\text {score} (x)$ 为实际得分为 $x$ 时用公式得到的绩点。那么很显然总绩点 $= \sum \limits _ {i = 1} ^ n \text {score} (c _ i) \times a _ i$,总学分 $= \sum \limits _ {i = 1} ^ n a _ i$。答案就是 $\sum \limits _ {i = 1} ^ n \text {score} (c _ i) \times a _ i \over \sum \limits _ {i = 1} ^ n a _ i$。
我们可以用函数(一大堆 if
语句)或 define
来设计出这个绩点公式 $\text {score} (x)$,就可以求出答案。
AC Code
define
版本
#include <cstdio>
#define N 15
#define sc(x) ((x)>=90?4:(x)>=85?3.7:(x)>=82?3.3:(x)>=78?3:(x)>=75?2.7:(x)>=72?2.3:(x)>=68?2:(x)>=64?1.5:(x)>=60?1:0) // define 和三目运算符就是快
using namespace std;
int n, x, sum, a[N];
double ans;
int main ()
{
scanf ("%d", &n);
for (int i = 1; i <= n; i ++)
{
scanf ("%d", &a[i]), sum += a[i]; // 预处理总学分
}
for (int i = 1; i <= n; i ++)
{
scanf ("%d", &x), ans += sc (x) * a[i]; // 总绩点加上公式的绩点 x 学分
}
ans /= sum, printf ("%.2lf", ans); // 总绩点 /= 总学分,输出答案(保留两位小数)
return 0;
}
函数版本
#include <cstdio>
#define N 15
using namespace std;
int n, x, sum, a[N];
double ans;
double sc (int x) // score 函数
{
if (x >= 90)
{
return 4;
}
if (x >= 85)
{
return 3.7;
}
if (x >= 82)
{
return 3.3;
}
if (x >= 78)
{
return 3;
}
if (x >= 75)
{
return 2.7;
}
if (x >= 72)
{
return 2.3;
}
if (x >= 68)
{
return 2;
}
if (x >= 64)
{
return 1.5;
}
if (x >= 60)
{
return 1;
}
return 0;
}
int main ()
{
scanf ("%d", &n);
for (int i = 1; i <= n; i ++)
{
scanf ("%d", &a[i]), sum += a[i];
}
for (int i = 1; i <= n; i ++)
{
scanf ("%d", &x), ans += sc (x) * a[i];
}
ans /= sum, printf ("%.2lf", ans);
return 0;
}
感谢观看!
$$\href {/blog/content/29204/} {\color {LimeGreen} {【寒假每日一题】题解}}$$
define和三目运算符,绝了orz
简单通透