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;
}