已知一个成绩和绩点的转换表,每课的学分都是1,一共n门,n门总分为avg,则他的gpa最低是多少?最高是多少?
最开始想的dp..dp[i][j]表示前i门,成绩和为j+60*i,gpa的最值为多少..后来发现复杂度有点高没敢写..如果把成绩都除以5的话..最后又剩余一个100不知道怎么处理..
然后惊奇的发现可以贪心..算最高绩点的时候,依次把每科提升到85。算最低绩点的时候,先把所有科都提升到69,然后依次把每科提升到100。
#include <cstdio>
#include <cstring>
int avg,n,sum;
double maxgpa,mingpa;
int main() {
int t,rn;
scanf("%d",&t);
while (t--) {
scanf("%d%d",&avg,&n);
avg-=60;
maxgpa=mingpa=2.0*n;
sum=avg*n;
rn=n;
while (rn--&&sum>0) {
if (sum>=25) {
sum-=25;
maxgpa+=2.0;
} else if (sum>=20) {
sum-=20;
maxgpa+=1.5;
} else if (sum>=15) {
sum-=15;
maxgpa+=1.0;
} else if (sum>=10) {
sum-=10;
maxgpa+=0.5;
} else sum=0;
}
sum=(avg-9)*n;
rn=n;
while (rn--&&sum>0) {
if (sum>=31) {
sum-=31;
mingpa+=2.0;
} else if (sum>=16) {
sum=0;
mingpa+=2.0;
} else if (sum>=11) {
sum=0;
mingpa+=1.5;
} else if (sum>=6) {
sum=0;
mingpa+=1.0;
} else if (sum>=1) {
sum=0;
mingpa+=0.5;
}
}
printf("%.4lf %.4lf\n",mingpa/n,maxgpa/n);
}
return 0;
}