Problem Description
小峰学习非常努力,想要评奖学金,而奖学金评定的一大标准就是绩点(GPA )高低。
单个科目的 GPA 的计算公式如下:f(x)=min(5.0,(x−45)×0.1) ,其中 x表示课程成绩,众所周知当 x<60 时 f(x)=0 。
在评定奖学金时用的是平均学分绩点,简而言之就是以学分为权重的绩点。
假设你考了三门课,绩点分别为 3.5,4.1,4.2 ,学分分别为 3,5,1 ,那么最终的平均学分绩点为 (3.5×3+4.1×5+4.2×1) / (3+5+1)=3.91 。
同时,存在两种竞赛类加分政策,第一种是学科类竞赛加分,第二种是体育与艺术类竞赛加分。
对于第一类加分,会直接在你的平均学分绩点中加上奖励绩点;假设加分前你的 GPA 为 3.48,奖励了 1.8 的绩点,那么你的最终平均学分绩点为 5.28 。
第二类加分制度奖励的不是绩点,而是学分额度。具体来说,你可以选择学分总和小于等于学分额度的若干门课程,将这些课程的成绩通过公式 f(x)=(x−70)×10/34+70 进行更改,其中 x 表示课程成绩。
不难发现这个公式可以让你考 36 分就及格,但是在大于 70 分时反而会使分数变少,所以小峰不会在成绩大于等于 70 时使用这个公式。
依然假设你考了三门课,成绩分别为 81,49,36 ,学分分别为 3,5,1 ,奖励的学分额度为 5 分。
你可以选择 1 分和 3 分的两门课,也可以只选择 5 分的那门课。为了方便起见,小峰会优先选择成绩最低的课程,如果有多门课程成绩一样,他会优先选择学分最少的课程。
那么在通过公式改变成绩之后,他的最终成绩会变成 81,49,60 。
已知小峰所有课程的成绩以及学分、他的第一类加分的奖励绩点、他的第二类加分的学分额度,以及全年级其他同学的最终平均学分绩点。他想知道自己的年级排名。
PS:上文提到的所有公式的输入与输出都不一定是整数。
Input
第一行一个整数 T(1≤T≤100) ,表示测试数据组数。接下来包含 T 组测试数据。
对于每组测试数据,第一行输入两个整数 n,d (1≤n≤50,0≤d≤24) 和一个实数c (0≤c≤1.8) ,表示小峰参加考试的课程数量、第二类加分的学分额度和第一类加分的奖励绩点。
接下来输入 n 行,每行两个整数 x,y (0≤x≤100,1≤y≤5) ,表示每门课程的成绩和学分。
接下来一行输入一个整数 k (1≤k≤100) ,表示全年级除了小峰外还有多少同学。
最后一行输入 k 个实数 ti(0≤ai≤5.0) ,表示每个人的最终平均学分绩点。
Output
对于每组测试数据,输出一个数表示小峰的年级排名。
数据保证不会有人的绩点和小峰一样。
Sample Input
1
3 5 1.0
81 3
49 5
36 1
4
5.0 1.0 2.5 1.5
Sample Output
3
热身赛的压轴题的简单版,题目很长,但是耐心读完题后就会发现题其实很简单,对代码的细节要求比较高。
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
struct stu //使用结构体,后面方便数据调用以及排序
{
double cj,xf;
double jd;
}ss[55];
bool cmp(stu a,stu b) //sort排序
{
if(a.cj==b.cj)
{
return a.xf<b.xf;
}
else
{
return a.cj<b.cj;
}
}
double gs(double a) //公式计算函数
{
double res;
res=(a-70)*10/34+70;
return res;
}
double jdhs(double a) //绩点计算函数
{
double res;
if(a>=60)
{
res=(a-45)*0.1;
}
else
{
res=0;
}
return res;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,d;
double zxf=0,jdz=0;
double c;
cin>>n>>d>>c;
for(int a=0;a<n;a++)
{
cin>>ss[a].cj>>ss[a].xf;
zxf+=ss[a].xf; //总学分提前直接求出
}
sort(ss,ss+n,cmp); //排序
for(int a=0;a<n;a++)
{
int pd=0;
if(pd+=ss[a].xf<d)
{
ss[a].cj=gs(ss[a].cj); //将 学分和 小于输入学分的成绩代入公式中计算求值。
}
ss[a].jd=jdhs(ss[a].cj); //求出绩点
jdz+=ss[a].jd*ss[a].xf; //f(x)中的分子(总绩点)
}
double pjfjd=(jdz/zxf)+c; //求平均分绩点
int xs;
cin>>xs;
double arr;
int pdd=xs+1; //将小峰也算入人数
for(int a=0;a<xs;a++)
{
cin>>arr;
if(pjfjd>arr)
{
pdd--;
}
}
cout<<pdd<<endl;
}
}