PAT A1012 The Best Rank

PAT A1012 The Best Rank

在这里插入图片描述

  • 思路1:
    查询学生排名最靠前的科目(A>C>M>E),用一个全局的Rank矩阵,记录每个学生各科的排名

  • code1:

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;	//别忘了...
const int INF = 0x3fffffff; 
const int maxn = 2010;
int n, m, now;
struct Stu{
	int id, grade[4];
}stu[maxn];
int Rank[1000010][5];

bool cmp(Stu a, Stu b){
	return a.grade[now] > b.grade[now];
}
int main(){
	scanf("%d %d", &n, &m);
	for(int i = 0; i < n; ++i){
		scanf("%d %d %d %d", &stu[i].id, &stu[i].grade[1], &stu[i].grade[2], &stu[i].grade[3]);
		stu[i].grade[0] = (stu[i].grade[1] + stu[i].grade[2] + stu[i].grade[3]) / 3;
	}	
	for(now = 0; now < 4; ++now){
		sort(stu, stu+n, cmp);
		int r = 2;
		Rank[stu[0].id][now] = 1;
		Rank[stu[0].id][4] = INF;
		for(int i = 1; i < n; ++i){
			Rank[stu[i].id][4] = INF;	//存在标志 
			if(stu[i].grade[now] == stu[i-1].grade[now]){
			//如果和前一个相同
				Rank[stu[i].id][now] = Rank[stu[i-1].id][now];
			}else{
				Rank[stu[i].id][now] = r;
			}
			r++;	
		}
	}
	int query;
	char subjects[4] = {'A', 'C', 'M', 'E'};
	for(int i = 0; i < m; ++i){
		scanf("%d", &query);	
		if(Rank[query][4] == INF){
			int minR, Min = INF;
			for(int j = 0; j < 4; ++j){
				if(Rank[query][j] < Min){
					Min = Rank[query][j];
					minR = j;
				}
			}
			printf("%d %c\n", Rank[query][minR], subjects[minR]);
		}else{
			printf("N/A\n");	//这里也要加\n 
		}
	}
	return 0;
} 
  • TIPS:
    为了减少代码量,将4个科目按优先级对应为0(A)、1(C)、2(M)、3(E),存储时结构体中用grade[4]存储这4个量,同时用一个全局的变量now控制,这样无论是排序,cmp函数,还是查询,都可以方便的通过for循环一个遍历搞定,而不是重复写4遍!

  • T2 code:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2020;
struct Stu{
	int id;
	int s[5];
}stu[maxn];
int r[1000010][5];
char c[5] = "ACME";
int flag;
bool cmp(Stu a, Stu b){
	return a.s[flag] > b.s[flag];
}
int main(){
	int n, m;
	scanf("%d %d", &n, &m);
	for(int i = 0; i < n; ++i){
		scanf("%d %d %d %d", &stu[i].id, &stu[i].s[1], &stu[i].s[2], &stu[i].s[3]);
		stu[i].s[0] = stu[i].s[1] + stu[i].s[2] + stu[i].s[3];		
	}
	for(int i = 0; i < 4; ++i){
		flag = i;
		sort(stu, stu+n, cmp);
		r[stu[0].id][i] = 1;
		for(int j = 1; j < n; ++j){
			int pre = stu[j-1].id, now = stu[j].id;
			if(stu[j].s[i] != stu[j-1].s[i]) r[now][i] = j + 1;
			else r[now][i] = r[pre][i];		
		}
	}
	for(int i = 0; i < m; ++i){
		int q;
		scanf("%d", &q);
		if(r[q][0] == 0) printf("N/A\n");
		else{
			int Min = 0x3fffffff, min_c = -1;
			for(int j = 0; j < 4; ++j){
				if(r[q][j] < Min){
					Min = r[q][j];
					min_c = j;
				}
			}
			printf("%d %c\n", r[q][min_c], c[min_c]);
		}
	}
	return 0;
} 
  • T3 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2020;
struct Stu
{
    int id, ranklist[5];
}stu[maxn];
struct Course
{
    int id, score;
};
vector<Course> cou[5];
unordered_map<int, int> get_id;
const char course_sign[5] = "ACME";
void PrintRank(int id)
{
    int best_rank = stu[id].ranklist[0], best_course = 0;
    for(int i = 1; i < 4; ++i)
    {
        if(stu[id].ranklist[i] < best_rank)
        {
            best_rank = stu[id].ranklist[i];
            best_course = i;
        }
    }
    printf("%d %c\n", best_rank, course_sign[best_course]);
}
bool cmp(Course a, Course b)
{
    return a.score > b.score;
}
int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; ++i)
    {
        int tid, sco[5];
        scanf("%d %d %d %d", &tid, &sco[1], &sco[2], &sco[3]);
        get_id[tid] = i;
        stu[i].id = tid;
        sco[0] = sco[1] + sco[2] + sco[3];
        for(int j = 0; j < 4; ++j)
            cou[j].push_back(Course{tid, sco[j]});
    }
    for(int i = 0; i < 4; ++i)
    {
        sort(cou[i].begin(), cou[i].end(), cmp);
        int r = 1;
        for(int j = 0; j < cou[i].size(); ++j)
        {
            int tid = get_id[cou[i][j].id];
            if(j != 0 && cou[i][j].score != cou[i][j-1].score) r = j + 1;
            stu[tid].ranklist[i] = r;
        }
    }
    for(int i = 0; i < m; ++i)
    {
        int qid;
        scanf("%d", &qid);
        if(get_id.find(qid) == get_id.end())
        {
            printf("N/A\n");
        }else
        {
            PrintRank(get_id[qid]);
        }
    }
    return 0;
}

  • T4 code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2020;
char sign[5] = "ACME";
struct Stu
{
    int id, score[5];
}stu[maxn];
unordered_map<int, vector<int> > ranklist;

int ctl;
bool cmp(const Stu & a, const Stu & b)
{
    return a.score[ctl] > b.score[ctl];
}
int main()
{
    int n, nq;
    scanf("%d %d", &n, &nq);
    for(int i = 0; i < n; ++i)
    {
        scanf("%d", &stu[i].id);
        for(int j = 1; j < 4; ++j)
        {
            scanf("%d", &stu[i].score[j]);
            stu[i].score[0] += stu[i].score[j];
        }
    }
    for(int i = 0; i < 4; ++i)
    {
        ctl = i;
        sort(stu, stu + n, cmp);
        int r = 1;
        for(int j = 0; j < n; ++j)
        {
            if(j != 0 && stu[j].score[i] != stu[j-1].score[i]) r = j + 1;
            ranklist[stu[j].id].push_back(r);
        }
    }
    for(int i = 0; i < nq; ++i)
    {
        int q;
        scanf("%d", &q);
        if(ranklist.find(q) == ranklist.end())
        {
            printf("N/A\n");
        }else
        {
            int Min = ranklist[q][0], ans_c = 0;
            for(int j = 1; j < 4; ++j)
            {
                if(ranklist[q][j] < Min)
                {
                    Min = ranklist[q][j];
                    ans_c = j;
                }
            }
            printf("%d %c\n", Min, sign[ans_c]);
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值