题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805393241260032

思路

这题比较简单,就是理解题意花了很久
关键点在于设置初始值,未提交的设成-2,未通过编译的设成-1
还有ACnum以及isPrint两个标志位用于判断各类情况,其他都只是变量过多造成的复杂而已。

借鉴

另一种方式给出排名

  1. for(int i = 1; i <= N; i++) {
  2. user[i].rank = i;
  3. if(i != 1 && user[i].total == user[i - 1].total)
  4. user[i].rank = user[i - 1].rank;
  5. }

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;

struct Person{
    int rank,id,total;
    vector<int> score;
    int ACnum;
    bool isPrint;
};

bool cmp(Person a, Person b){
    if(a.total!=b.total) return a.total > b.total;
    else if(a.ACnum!=b.ACnum) return a.ACnum > b.ACnum;
    else return a.id < b.id;
}


int main(){
    int N,K,M;
    int p[6];
    //N是参加比赛的人数,K是问题数,M是提交数;
    scanf("%d%d%d",&N,&K,&M);
    vector<Person> user(N+1);
    for(int i = 1; i <= K; i++){
        scanf("%d",&p[i]);
    }
    //初始化数据
    for(int i = 1; i <= N; i++){
        user[i].score.resize(K+1,-2);
    }
    int tempid,tempnum,tempscore;
    for(int i = 0; i < M; i++)
    {
        scanf("%d%d%d",&tempid,&tempnum,&tempscore);
        user[tempid].id = tempid;
        if (tempscore > user[tempid].score[tempnum])
            user[tempid].score[tempnum] = tempscore;
    }
    /*for(int i = 1; i <= N; i++)
    {
        printf("%05d ",i);
        for(int j = 1; j <= K; j++) 
            printf("%d :%d ",j,user[i].score[j]);
        printf("\n");
    }*/

    for(int i = 1; i <= N; i++)
    {
        user[i].ACnum = 0;
        user[i].isPrint = false;
        user[i].total = 0;
        for(int j = 1; j <= K; j++)
        {
            if(user[i].score[j]!=-1&&user[i].score[j]!=-2)
                user[i].total += user[i].score[j];
            if(user[i].score[j]==p[j])
                user[i].ACnum ++;
            if(user[i].score[j]>-1)
                user[i].isPrint = true;
        }
    }
    sort(user.begin()+1,user.end(),cmp);

    for(int i = 1; i <= N; i++) {
        user[i].rank = i;
        if(i != 1 && user[i].total == user[i - 1].total)
            user[i].rank = user[i - 1].rank;
    }
    for(int i = 1; i <= N; i++)
    {
        if(user[i].isPrint)
        {
            printf("%d %05d %d", user[i].rank, user[i].id, user[i].total);
            for(int j = 1; j <= K; j++) {
                if(user[i].score[j] != -1 && user[i].score[j] != -2)
                    printf(" %d", user[i].score[j]);
                else if(user[i].score[j] == -2)
                    printf(" -");
                else if(user[i].score[j] == -1)
                    printf(" 0");
            }
            printf("\n");
        }
    }
    return 0;
}