PAT 甲级 A1075 (2019/02/18)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 10010;
struct PAT_Student{
    int id;     //考号
    int score[6];   //每道题的分数
    bool flag;      //是否有能通过编译的提交
    int all_score;  //总分
    int prefect_problem;//完美题解数
}stu[MAXN], temp;
int full[6];
int n, k, m;
bool cmp(PAT_Student a, PAT_Student b) {
    if(a.all_score != b.all_score)
        return a.all_score > b.all_score;   //从总分大到小排列
    else if(a.prefect_problem != b.prefect_problem)
        return a.prefect_problem > b.prefect_problem;   //完美AC的题目数从多到少排列
    else
        return a.id < b.id; //考号小的在前面,既有小到大
}
void init() {       //初始化
    for(int i = 1; i <= n; i++) {
        stu[i].id = i;          //stu[i]中,0000i即为考号
        stu[i].all_score = 0;   //刚开始,大家得总分为 0
        stu[i].prefect_problem = 0;         //完美AC数为0
        stu[i].flag = false;    //没有未通过编译的提交
        memset(stu[i].score, -1, sizeof(stu[i].score));
    }
}
int main(){
    scanf("%d %d %d", &n, &k, &m);
    init();
    for(int i = 1; i <= k; i++){
        scanf("%d", &full[i]);
    }
    int user_id, problem_id, partial_score_obtained;
    for(int i = 0; i < m; i++){
        scanf("%d %d %d", &user_id, &problem_id, &partial_score_obtained);
        //  若不是编译错误,则该考生有能通过编译的提交
        if( partial_score_obtained != -1){
            stu[user_id].flag = true;
        }
        //  某题第一次编译错误,分值记为0分,便于输出
        if( partial_score_obtained == -1 && stu[user_id].score[problem_id] == -1){
            stu[user_id].score[problem_id] = 0;
        }
        //  题第一次获得满分,则完美AC数加1
        if( partial_score_obtained == full[problem_id] && stu[user_id].score[problem_id] < full[problem_id]){
            stu[user_id].prefect_problem++;
        }
        //  某题获得更高分值,则覆盖
        if( partial_score_obtained > stu[user_id].score[problem_id]){
            stu[user_id].score[problem_id] = partial_score_obtained;
        }
    }
    //  计算总分
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= k; j++){
            if(stu[i].score[j] != -1){
                stu[i].all_score += stu[i].score[j];
            }
        }
    }
    //  排序
    sort(stu + 1, stu + n + 1, cmp);
    //  当前排名
    int r = 1;
    for(int i = 1; i <= n && stu[i].flag == true; i++){
        //  当前考生分数低于前一位考生分数时,则排名为在该考生之前的总考生数
        if(i > 1 && stu[i].all_score != stu[i - 1].all_score){
            r = i;
        }
        printf("%d %05d %d", r, stu[i].id, stu[i].all_score);
        for(int j = 1; j <= k; j++){
            if(stu[i].score[j] == -1){// 没有提交过
                printf(" -");
            }else{
                printf(" %d", stu[i].score[j]);
            }
        }
        printf("\n");
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/zjsaipplp/p/10425247.html

时间: 2024-10-09 01:06:35

PAT 甲级 A1075 (2019/02/18)的相关文章

PAT 甲级 A1092 (2019/02/18)

#include<cstdio> #include<cstring> int change(char ch){ if(ch >= '0' && ch <= '9') return ch - '0'; if(ch >= 'a' && ch <= 'z') return ch - 'a' + 10; if(ch >= 'A' && ch <= 'Z') return ch - 'A' + 36; } i

PAT 甲级 A1084 (2019/02/18)

#include<cstdio> #include<cstring> int main(){ char str1[101], str2[101]; bool HashTable[128] = {false}; scanf("%s", str1); scanf("%s", str2); int len1 = strlen(str1); int len2 = strlen(str2); for(int i = 0; i < len1; i+

PAT 甲级 A1080 (2019/02/18)

#include<cstdio> #include<algorithm> using namespace std; struct Student{ int GE, GI, SUM; //初试分,面试分,总分 int rank, stuID; //名次, 考生id int cho[6]; //志愿 }stu[40010]; struct School{ int quota; //招生人数 int stuNum; //实际招生人数 int ID[40010]; //招收学生的编号 in

PAT甲级【2019年3月考题】——A1158 TelefraudDetection【25】

Telefraud(电信诈骗) remains a common and persistent problem in our society. In some cases, unsuspecting victims lose their entire life savings. To stop this crime, you are supposed to write a program to detect those suspects from a huge amount of phone c

PAT甲级1005 Spell It Right

题目:PAT甲级 1005 题解:水题.看到题目的第一时间就在想一位一位的mod,最后一加一转换就完事了.结果看到了N最大为10的100的次方,吓得我赶紧放弃这个想法... 发现碰到这种情况用字符串十分好用,这道题应该考察的就是这一点.大致思路就是把数字的每一位放到字符串中,然后通过ASCII码得到每一位的相加结果num,然后把num一位一位的放到stack中,使用stack是因为它先进先出的特性,最后输出就行了. 代码: 1 #include<cstdio> 2 #include<qu

【谜客帝国】第147届月思主擂谜会(2019.02.15)

 [谜客帝国]第147届月思主擂谜会(2019.02.15) 主持计分:东东 1.“人在中天日月间”(9笔字)春/月思 [注:面出陈孚<开平即事二首>,“势超大地山河上,-.”] 2. 玉漏声中烟气袅(3字法国奢侈品牌)YSL/月思 3. 双双相念初相爱(2字著名动漫人物)菜菜/月思 4.“数点燕云州外.雪霜威”(足球用语二,4+3)4132.451/月思 [注:面出余文<相见欢>,“登高望断龙旗,未曾归.几度中原北定,梦依稀.朔风乱,胡尘漫,掩斜晖.-.”] 5.“十载同心如一人

PAT甲级专题|最短路

PAT甲级最短路 主要算法:dijkstra 求最短最长路.dfs图论搜索. 1018,dijkstra记录路径 + dfs搜索路径最值 25分,错误点暂时找不出.. 如果只用dijkstra没法做,只能得20分 #include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 510; int cmax,n,ter,m; int caps[maxn]; int g[maxn][m

PAT甲级考前整理

终于在考前,刷完PAT甲级130道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种境界.PAT甲级题目总的说卡题目的比较多,卡测试点的比较少,有些题目还会有题意混淆,这点就不吐槽了吧.静下心来耍这130道题,其实磨练的是一种态度与手感,养成的是一种习惯.热爱AC没有错!! 130道题目主要的考点: 1.排序:快速排序,直接插入排序,希尔排序,分治排序,堆排序. 2.图论:拓扑排序.最短路径.深度搜索.广度搜索. 3.树:树的遍历.完全二叉树.AVL. 4.其他:并查集,模拟,哈希.背包.

2019.3.18考试&amp;2019.3.19考试

2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 T2 正反都做一遍DP T3 观察到顺序不影响答案,分块打标记 2019.3.19 肥肠爆芡,因为沙茶博主昨天在学校的煞笔食堂吃坏了肚子,所以这场考试咕咕了 我佛了 一定补这两场.jpg 原文地址:https://www.cnblogs.com/ydnhaha/p/10558495.html