PAT甲级1137.

目录

A1137

题目

样例

输入:

6 6 7
01234 880
a1903 199
ydjh2 200
wehu8 300
dx86w 220
missing 400
ydhfu77 99
wehu8 55
ydjh2 98
dx86w 88
a1903 86
01234 39
ydhfu77 88
a1903 66
01234 58
wehu8 84
ydjh2 82
missing 99
dx86w 81

输出:

missing 400 -1 99 99
ydjh2 200 98 82 88
dx86w 220 88 81 84
wehu8 300 55 84 84

思路和坑点

  思路:
  按照题目的要求,对学生进行过滤,筛选掉一定不合格的,然后计算总评成绩,并按照要求排序并输出结果。过滤数据有助于提高程序运行速度。

AC代码

#include<bits/stdc++.h>
using namespace std; 
typedef struct{
    string id;                          //学生名字
    int pscore,gmid,gfin,g;             //pscore为编程成绩,gmid表示期中成绩,gfin表示期末称其,g表示最终成绩
    bool is;                            //合格标记
}ST;
ST s[10000];
bool cmp(ST a,ST b){
     if(a.g!=b.g)    return a.g>b.g;    //按照总成绩从高到底
     else return a.id<b.id;             //成绩相同时候按照名字字典序排序
}
int main(void)
{
    int p,m,n,score;
    string name;
    map<string,int> mp;                 //每个人在数组中的下标
    scanf("%d %d %d",&p,&m,&n);
    for(int i=1;i<=p;i++){              //读入编程成绩并初始化其他成员变量
        cin>>name>>score;
        if(score<200) continue;         //编程成绩低于200分的一定不合格,直接过滤掉
        mp[name]=i;
        s[i].id=name;
        s[i].pscore=score;              //记录名字和编程成绩
        s[i].gmid=-1;                   //期中成绩初始化为-1
        s[i].is=false;                  //默认标记为不合格
    }
    for(int i=0;i<m;i++){
        cin>>name>>score;               //读入其中成绩
        if(mp[name]!=0)                 //如果编程成绩合格,记录期中成绩
            s[mp[name]].gmid=score;
    }
    for(int i=0;i<n;i++){
        cin>>name>>score;
        if(mp[name]==0) continue;       //如果不在统计范围内,则跳过步处理,过滤一定不合格的学生
        int mid=s[mp[name]].gmid;       //获取期中成绩
        s[mp[name]].gfin=score;         //记录期末成绩
        if(mid<=score)                  //如果期中成绩小于期末成绩,总成绩为期末成绩
            s[mp[name]].g=score;        
        else                            //否则按照要求进行计算
            s[mp[name]].g=(0.5+0.4*mid+0.6*score);
        if(s[mp[name]].g>=60)           //如果总成绩也达标
            s[mp[name]].is=true;        //标记为合格
    }
    sort(s+1,s+p+1,cmp);                //排序并输出合格学生的信息
    for(int i=1;i<=p;i++){
        if(s[i].is)
            cout<<s[i].id<<' '<<s[i].pscore<<' '<<s[i].gmid<<' '<<s[i].gfin<<' '<<s[i].g<<'\n';
    }
    return 0;
}