浙江大学PAT甲级A1075(C++)题解

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
struct student{
    int perfect;
    int rank;
    int sid;
     vector<int> score;
    int sum;
    bool isCompile;
}Student[100010];
int sid;

bool cmp(student a,student b){
    if(a.sum!=b.sum){
        return a.sum>b.sum;
    } else if(a.perfect!=b.perfect){
        return a.perfect>b.perfect;
    }else{
        return a.sid<b.sid;
    };
}
int main() {
    int N,K,M;
    cin>>N>>K>>M;
    int P[K];
    for(int i =1;i<=K;i++){
        cin>>P[i];
    }

    vector<student> v(N+1);
//    cout<<v.size();
    int flag[100010]={0};
    for(int i = 1;i<=N;i++){
        v[i].score.resize(K+1,-3);
    }

    for (int i = 0; i <M ; i++) {
        int pth;
        cin>>sid;
        cin>>pth;
        int cur_score;
        cin >> cur_score;
        int n = v[sid].score[pth];
        v[sid].score[pth]=max(n,cur_score);
        if(cur_score!=-1){
            v[sid].isCompile=true;
        }
        v[sid].sid =sid;
        v[sid].perfect =0;
    }
//
//
    for(int i =1;i<=N;i++){
         int sum =0;
         for(int j =1;j<=K;j++){
             if(v[i].score[j]!=-1&&v[i].score[j]!=-3){
                 sum = sum + v[i].score[j];
                 v[i].sum = sum;
             }
             if(v[i].score[j]==P[j]){
                 v[i].perfect ++;
             }
         }
    }
//
//
//    set<int> s;
//    for(int i = 0;i<v.size();i++){
//        s.insert(v[i].sid);
//    }
//    vector<int> m ;
//    for(auto it:s){
//        m.push_back(it);
//    }
  //sort 之后下标从1 7 变成 0-6(原来0有元素但是我们不用 用1-7 排序之后 0-6位是我们自己的元素了 7元素不用)
    sort(v.begin(),v.end(),cmp);
    v[0].rank =1;
    for(int i =1;i<=N;i++){
         if(v[i].sum==v[i-1].sum){
             v[i].rank = v[i-1].rank;
         } else{
             v[i].rank =i+1;
         }
    }

//    cout<<Student[m[2]].sum<<endl;
    for(int i =0;i<v.size();i++){
        if(v[i].isCompile){
            printf("%d ",v[i].rank);
            printf("%05d ",v[i].sid);
            printf("%d ",v[i].sum);
            for(int j=1;j<=K-1;j++){
                if(v[i].score[j]!=-3){
                    if(v[i].score[j]==-1){
                        printf("0 ");
                    } else{
                        printf("%d ",v[i].score[j]);
                    }

                } else{
                    printf("- ");
                }
            }
            if(v[i].score[K]!=-3){
                if(v[i].score[K]==-1){
                    printf("0");
                } else{
                    printf("%d",v[i].score[K]);
                }
            } else{
                cout<<"-";
            }
            cout<<endl;
        } else{

        }
    }
    return 0;
}

最后一个测试点:没通过任何编译的不输出 通过编译哪怕全0 也输出 是否通过编译用 bool isCompile来代表

坑2:cout会超时 200ms限制有点蠢了 不过以后的限制都是400ms以上 超时几率小很多 大胆用cout吧。

坑3:逻辑较为复杂。很浪费时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值