PTA(上級レベル)1012.Theベストランク

:CSは、学生を専攻し、私たちの最初の年のパフォーマンスを評価するために、我々は唯一の3つのコースの成績を検討Cプログラミング言語C、 - M-数学(微積分やリニアAlgrbra)、およびE-英語。平均時間では、我々は彼らの最高ランクに強調することによって、学生を奨励する-つまり、3つのコースと平均グレードに関して4つのランクの中で、私たちは各学生のための最高ランクを印刷します。

例えば、の等級CMEおよび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

第一1は数学の第二1、英語での第3回1、および平均の最後の1ながら、Cプログラミング言語で最善を尽くしているので、その後、すべての学生のための最高ランクは1位です。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各ケースは、2つの数値を含む行で始まりN及びM学生の総数である(≤2000)、それぞれ、それらのランクをチェックする生徒の数。次に、N個のラインは、それぞれ順に、その学生の([0、100]の範囲内の)3つの整数の等級に続く6桁の文字列である学生IDが含まれ、従いCMそしてEそして、そこにあるMのライン、学生IDを含む各が。

出力仕様:

それぞれについて、Mの学生、1行にスペースで区切って、彼/彼女のために最高のランク、および対応するランクの記号を、印刷します。

ランキング方法の優先順位は次のように命じていますA> C> M> Eしたがって、最も優先順位の高い同じ最高ランク、出力1を得るために、学生のための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
考え
  • 4回を通じ並べ替えるには、各クエリのタイムアウトの後ろの結果を記録するたびにソートする必要があります
  • 例えば5つの個々のスコアであり、処理時間の同じ画分ことに注意:92 92 90 85 85対応するランクがなければなりません1 1 3 4 4
コード
#include<bits/stdc++.h>
using namespace std;
struct student
{
    int id;
    int score[4];   //分别记录A、C、M、E的分数
}a[2100];
int n,m;
int ranking[10000010][4] = {0};   //学号对应的,按某一类来排名的结果
int pos;
char s[4][2] = {"A", "C", "M", "E"};

bool cmp(student x, student y)
{
    return x.score[pos] > y.score[pos];
}

int main()
{
    cin >> n >> m;
    for(int i=0;i<n;i++)
    {
        cin >> a[i].id;
        cin >> a[i].score[1] >> a[i].score[2] >> a[i].score[3];
        a[i].score[0] = (a[i].score[1] + a[i].score[2] + a[i].score[3]) / 3;
    }

    for(pos=0;pos<4;pos++)      //4次排序
    {
        sort(a, a+n, cmp);
        ranking[a[0].id][pos] = 1;      //第一个当然是第一了

        //比如5个人的得分分别是:92 92 90 85 85 ,对应的排名应该是1 1 3 4 4
        for(int i=1;i<n;i++)
        {
            if(a[i].score[pos] == a[i-1].score[pos])
                ranking[a[i].id][pos] = ranking[a[i-1].id][pos];
            else
                ranking[a[i].id][pos] = i + 1;
        }
    }
    int t;
    for(int i=0;i<m;i++)
    {
        cin >> t;
        if(ranking[t][0] == 0)
            cout << "N/A\n";
        else
        {
            int k = 0;
            for(int j=0;j<4;j++)
                if(ranking[t][j] < ranking[t][k])   k = j;
            cout << ranking[t][k] << " " << s[k] << endl;
        }
    }
    return 0;
}

引用文

https://pintia.cn/problem-sets/994805342720868352/problems/994805502658068480

おすすめ

転載: www.cnblogs.com/MartinLwx/p/11761916.html