题意:知道N个课程的平均分,给出分数段到GPA的换算表。假设每个课程的学分都是1,求出可能的最大平均绩点和最小平均绩点。
思路:贪心。
先考虑最大平均绩点,如果每门成绩都在绩点对应区间的最小值,那我就能留下更大的分数去给其他科目。
观察表可知,85 - 100 ,69-60的区间间隔比其他的区间间隔大,那么可能在这两个区间操作性比较大。
能否想到:如果每科都以60为基准,将多余的分分给某些学科使该课到达85分,可以使最大平均绩点最大。
而最小平均绩点:以69分为基准,将多余的分数分给某些学科使该课到达100分。
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
double trans(int x)
{
if(x >= 85) return 4.0;
else if(x < 85 && x >= 80) return 3.5;
else if(x < 80 && x >= 75) return 3.0;
else if(x < 75 && x >= 70) return 2.5;
else return 2.0;
}
int T;
int eva, n;
int main(void)
{
//freopen("input.txt","r",stdin);
scanf("%d", &T);
while(T--){
scanf("%d%d",&eva,&n);
int tot = n * eva;
int r = tot - n * 69;
double mi = 0;
for(int i = 0 ; i < n; ++i){
if(r > 31){
r -= 31;
mi +=4.0;
}
else {
mi += trans(r + 69);
r = 0;
}
}
r = tot - n * 60;
double ma = 0;
for(int i = 0 ; i < n; ++i){
if(r >25){
r -= 25;
ma += 4.0;
}
else{
ma += trans(r + 60);
r = 0;
}
}
printf("%.4f %.4f\n",mi / n, ma / n);
}
return 0;
}