CS専攻の1年生の成績を評価するために、3つのコースの成績のみを考慮します。C
-Cプログラミング言語、M
-数学(微積分または線形代数)、およびE
-英語。その間、私たちは学生の最高ランクを強調することによって学生を奨励します。つまり、3つのコースと平均成績の4つのランクのうち、各学生の最高ランクを印刷します。
例えば、の等級C
、M
、E
およびA
- 4人の平均は以下のように与えられます。
StudentID C M E A
310101 98 85 88 90
310102 70 95 88 84
310103 82 87 94 88
310104 91 91 91 91
そして、Cプログラミング言語で1位、数学で2位、英語で3位、平均で最後の1位であるため、すべての学生の最高ランクは1位です。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各ケースは、生徒の総数であるNとM(≤2000)の2つの数字と、それぞれランクをチェックする生徒の数を含む行で始まります。次いで、N行はそれぞれの順にその学生の([0、100]の範囲内の)3つの整数の等級に続く6桁の文字列である学生IDが含まれ、従いC
、M
そしてE
。次に、M行があり、それぞれに学生IDが含まれています。
出力仕様:
M人の生徒ごとに、自分に最適なランクと、対応するランクの記号をスペースで区切って1行に印刷します。
ランキング方法の優先順位は次のように命じていますA
> C
> M
> E
。したがって、学生が同じ最高ランクを取得する方法が2つ以上ある場合は、優先度が最も高いものを出力します。
学生が採点リストにない場合は、単に出力しますN/A
。
サンプル入力:
5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999
サンプル出力:
1 C
1 M
1 E
1 A
3 A
N/A
アイデア
-
構造を使用して学生データを保存し、文字列タイプを使用して学生IDを保存し、最高の学生ランキング(科目の優先度はA> C> M> E)で件名を保存するのに最適です。したがって、この優先度の文字に対応する添え字が最適です。スコア[ 4]は学生の4つのスコアを表し、スコア[0]を使用して平均スコアを格納することに注意してください。ランク[4]は4つのスコアのランキングに対応します。
-
さらに、マップを使用して、学生が成績を持っているかどうかを判断します。キーと値のペアは(id、subscript)です。位置が変わるため、subscriptはstudents [2000]配列内の学生の位置を記録するために保存されます。各ソート後
-
カスタムcmp比較関数、並べ替えの3番目のパラメーターは比較関数です。この関数は2つのパラメーターのみを渡すことができるため、渡すグローバルインデックスを定義して、学生のスコアの比較を容易にします。
-
マップを挿入する方法:
exist.insert(pair<string,int>(students[i].stu_id, i)); // 记录students数组的下标
-
マップはキーがあるかどうかを判断します。キーがある場合、カウント関数は1を返し、そうでない場合は0を返します。
(exist.count(id) !=0){
注意点:
- 学生が単一の科目で同じスコアを持っている場合のランキング。たとえば、1,1,2,3,4ではなく1,1,3,4,5です。
- 平均スコアの場合、PATとNiuke.comの両方でサンプルを丸めずに渡すことができます(idは文字列です)
コード
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
struct stu
{
int scores[4];
string stu_id;
int rank[4];
int best; // 最好的科目
};
stu students[3000];
map<string,int>exist;
int index = -1;
bool cmp(stu a,stu b){
// 只能接受两个参数
return a.scores[index]>b.scores[index];
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> students[i].stu_id;
int sum = 0;
for (int j=1; j<=3; j++){
cin >> students[i].scores[j];
sum += students[i].scores[j];
}
students[i].scores[0] = sum/3;
}
for (index=0; index<=3; index++){
// 计算每个科目的排名
sort(students, students+n,cmp);
students[0].rank[index] = 1;
for(int j=1; j<n;j++){
students[j].rank[index] = j+1;
if (students[j].scores[index] == students[j-1].scores[index])
students[j].rank[index] = students[j-1].rank[index]; // 注意不要把rank打成scores
}
}
for(int i=0; i<n; i++){
exist.insert(pair<string,int>(students[i].stu_id, i)); // 记录students数组的下标
int min = students[i].rank[0];
students[i].best = 0;
for(int j=1; j<4; j++){
if (min > students[i].rank[j]){
min = students[i].rank[j];
students[i].best = j;
}
}
}
// for (int i=0; i<n; i++){
// cout <<students[i].stu_id << " " << students[i].best << " " <<students[i].rank[students[i].best] <<endl;
// }
// cout <<endl;
// for (auto it= exist.begin(); it != exist.end(); it++){
// cout << it->first << " " << it->second << endl;
// }
char arr[] = {
'A','C','M','E'};
string id;
for (int i=0; i<m; i++){
cin >> id;
if (exist.count(id) !=0){
int index = exist[id];
// cout << "index:" <<index << endl;
cout << students[index].rank[students[index].best] << " " <<arr[students[index].best] << endl;
}
else{
cout << "N/A" << endl;
}
}
// cout << students[exist["310101"]].stu_id << " " << students[exist["310101"]].best <<endl;
return 0;
}