pat 1075

之前没有考虑到AC过后还会再次提交AC的代码,这时perfect就不应该在次改变,查了好久%>_<%

#include<stdio.h>
#include<algorithm>

using namespace std;

struct person{
    int id;
    int problem[5];
    int grade;
    int rank;
    int flag;
    int perfect;
};

bool cmp_rank(const struct person &a, const struct person &b){
    return a.grade > b.grade;
}

bool cmp(const struct person &a, const struct person &b){
    if (a.grade == b.grade)
        if (a.perfect == b.perfect)
            return a.id < b.id;
        else return a.perfect > b.perfect;
    else return a.grade > b.grade;
}
int main(){
    freopen("1.in", "r", stdin);
    int NumOfProblem, NumOfUser, NumOfSub;
    scanf("%d%d%d", &NumOfUser, &NumOfProblem, &NumOfSub);
    int i;
    int problem[5];
    struct person *user = new struct person[NumOfUser + 5];
    for (i = 0; i < NumOfUser; i++){
        user[i].grade = 0;
        user[i].flag = 0;
        user[i].perfect = 0;
        user[i].id = i + 1;
        for (int j = 0; j < NumOfProblem; j++)
            user[i].problem[j] = -2;
    }
    for (i = 0; i < NumOfProblem; i++)
        scanf("%d", &problem[i]);
    int id, pro, grade;
    for (i = 0; i < NumOfSub; i++){
        scanf("%d%d%d", &id, &pro, &grade);
        if (grade == problem[pro - 1]&&user[id - 1].problem[pro - 1]!=grade)//就是这里!!!
            user[id - 1].perfect++;
        if (grade >= 0){
            if (grade>user[id - 1].problem[pro - 1])
                if (user[id - 1].problem[pro - 1]>=0)
                    user[id - 1].grade += grade - user[id - 1].problem[pro - 1];
                else user[id - 1].grade += grade;
            user[id - 1].flag = 1;
        }
        if (grade>user[id - 1].problem[pro - 1])
            user[id - 1].problem[pro - 1] = grade;
    }
    sort(user, user + NumOfUser, cmp);
    for (i = 0; i < NumOfUser; i++){
        if (i == 0)
            user[i].rank = 1;
        else if (user[i].grade == user[i - 1].grade)
            user[i].rank = user[i - 1].rank;
        else user[i].rank = i + 1;
        }
    for (i = 0; i < NumOfUser; i++){
        if (user[i].flag){
            printf("%d %05d %d", user[i].rank, user[i].id, user[i].grade);
            for (int j = 0; j < NumOfProblem; j++)
                if (user[i].problem[j] != -2)
                    if (user[i].problem[j] == -1)
                        printf(" 0");
                    else printf(" %d", user[i].problem[j]);
                else printf(" -");
                putchar('\n');
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值