正式赛1005 小峰爱学习

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;
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焚冉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值