1036 Boys vs Girls (25分)

题目大意:给出n个学生的姓名、性别、ID和成绩。求取得最高分的女生和最低分的男生。分别输出两人的姓名、ID,以及女生成绩减去男生成绩的差。

思路:此处给出两种解法。

  1. 使用两个优先队列分别来维护男生和女生的信息。男生队列中成绩低者位于队首,女生队列中成绩高者位于队首。
  2. 使用一个vector来存储学生信息,最后按照性别升序、成绩降序进行排序,这样第一个就是女生成绩最高者,最后一个就是男生成绩最低者。

代码:

优先队列

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

struct Female{
    string name,id;
    int sc;
    Female(){}
    Female(string name,string id,int sc): name(name),id(id),sc(sc){}
    bool operator <(const Female &a)const{
        return sc<a.sc;
    }
};
struct male{
    string name,id;
    int sc;
    male(){}
    male(string name,string id,int sc): name(name),id(id),sc(sc){}
    bool operator <(const male &a)const{
        return sc>a.sc;
    }
};

int main()
{
    priority_queue<Female> f;
    priority_queue<male> m;
    int n;

    scanf("%d",&n);
    for(int i=0;i<n;i++){
        string name,gender,id; int sc;
        cin>>name>>gender>>id>>sc;
        if(gender=="M") m.push(male(name,id,sc));
        else f.push(Female(name,id,sc));
    }

    int flag=0;
    if(f.empty()){flag=1; printf("Absent\n");}
    else printf("%s %s\n",f.top().name.c_str(),f.top().id.c_str());
    if(m.empty()){flag=1; printf("Absent\n");}
    else printf("%s %s\n",m.top().name.c_str(),m.top().id.c_str());
    if(flag) printf("NA\n");
    else printf("%d\n",f.top().sc-m.top().sc);

    return 0;
}

vector

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

struct Node{
    string name,gen,id;
    int sc;
    Node(){}
    Node(string name,string gen,string id,int sc): name(name),gen(gen),id(id),sc(sc){}
};

vector<Node> v;

bool cmp(const Node &a,const Node &b){
    if(a.gen==b.gen) return a.sc>b.sc;
    return a.gen<b.gen;
}

int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        string name,id,gen; int sc;
        cin>>name>>gen>>id>>sc;
        v.push_back(Node(name,gen,id,sc));
    }

    sort(v.begin(),v.end(),cmp);

    if(v.empty()) printf("Absent\nAbsent\nNA\n");
    else{
        int flag=0;
        if(v[0].gen!="F"){flag=1; printf("Absent\n");}
        else printf("%s %s\n",v[0].name.c_str(),v[0].id.c_str());
        if(v[v.size()-1].gen!="M"){flag=1; printf("Absent\n");}
        else printf("%s %s\n",v[v.size()-1].name.c_str(),v[v.size()-1].id.c_str());
        if(flag) printf("NA\n");
        else printf("%d\n",v[0].sc-v[v.size()-1].sc);
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值