PAT_1012. The Best Rank

//
//  main.cpp
//  PAT_1012. The Best Rank
//
//  Created by wjq on 17/4/1.
//  Copyright © 2017年 wjq. All rights reserved.
//

#include <iostream>
#include <map>
#include <algorithm>
#include <string.h>
using namespacestd;
char course[4]={'C','M','E','A'};
int M,N;
struct student
{
    string id;
    int grade[4];          //存放学生的成绩 C M E A
    int rank[5];           //存放学生的成绩排名 C M E A bestrank
    char symbol;           //
}stu[2005];
map <string,student> mymap;
bool cmpC(student a ,student b)
{
    return a.grade[0]>b.grade[0];
}
bool cmpM(student a,student b)
{
    return a.grade[1]>b.grade[1];
}
bool cmpE(student a,student b)
{
    return a.grade[2]>b.grade[2];
}
bool cmpA(student a,student b)
{
    return a.grade[3]>b.grade[3];
}
int ave(double a,double b,double c)
{
    double result = (a+b+c)/3;
    if(result-(int)result<0.5)
        return (int)result;
    return (int)result+1;
}
void getBest(int num)
{
    int curRank=1;
    int curGrade=stu[0].grade[num];        //curGrade表示当前最小分数
    for(int i=0;i<M;i++)
    {
        if(stu[i].grade[num]==curGrade)
            stu[i].rank[num]=curRank;
        elseif(stu[i].grade[num]<curGrade) //只有当目前的学生的分数比curGrade低的时候,curRank才会增加
        {
            curRank=i+1;
            stu[i].rank[num]=curRank;
            curGrade=stu[i].grade[num];
        }
        if(stu[i].rank[4]>=stu[i].rank[num])
        {
            stu[i].rank[4]=stu[i].rank[num];
            stu[i].symbol=course[num];
        }
    }
}
void output()
{
    
    for(int i=0;i<M;i++)
        cout<<stu[i].id<<" "<<stu[i].grade[0]<<" "<<stu[i].grade[1]<<" "<<stu[i].grade[2]<<" "<<stu[i].grade[3]<<endl;
    for(int i=0;i<M;i++)
        cout<<stu[i].id<<" "<<stu[i].rank[0]<<" "<<stu[i].rank[1]<<" "<<stu[i].rank[2]<<" "<<stu[i].rank[3]<<" "<<stu[i].rank[4]<<" "<<stu[i].symbol<<endl;
}
int main(int argc,const char * argv[])
{
    string temp;
    cin>>M>>N;
    for(int i=0;i<M;i++)
    {
        cin>>stu[i].id>>stu[i].grade[0]>>stu[i].grade[1]>>stu[i].grade[2];
        stu[i].grade[3]=ave(stu[i].grade[0],stu[i].grade[1],stu[i].grade[2]);
        stu[i].rank[4]=1000;
        //mymap[stu[i].id]=stu[i];为什么放在这里map 之后对stu更新不会再更新map中的stu了????
    }
    
    sort(stu,stu+M,cmpE);
    getBest(2);
    
    sort(stu,stu+M,cmpM);
    getBest(1);
    
    sort(stu,stu+M,cmpC);
    getBest(0);

    sort(stu,stu+M,cmpA);
    getBest(3);

    for(int i=0;i<M;i++)               //必须在这里建立map的映射关系
        mymap[stu[i].id]=stu[i];
    for(int i=0;i<N;i++)
    {
        cin>>temp;
        if(mymap.find(temp)==mymap.end())
            cout<<"N/A"<<endl;
        else
            cout<<mymap[temp].rank[4]<<" "<<mymap[temp].symbol<<endl;
    }
    return 0;
}



水题...但是被卡了N个小时,,最后求助同学发现看错题了! 优先级是A>C>E>M 我一直想当然的以为是A>M>E>C,一直调试找不出问题- -

看了网上的代码,还是找不出错误,天了个噜...


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值