A1025 PAT Ranking (25分)

考察:考场内排序,考场外又排序一次,两次排序

learn && wrong:
1、考场号置为i就行了,而不是人数,第二个输入数字是人数,你搞错了
2、结构体名字跟结构体数组名字冲突了,cmp做参数就不知道哪一个了
3、sort函数可以对二维数组用行排列
4、得出序号,第一个设置序号设置为1,借来for循环,如果相同,则与前一个相同,不同则下标+1
5、结构体不设排序号,直接输出排序号,就是设一个变量+一个循环

id(i > 0 && stu[i].score != stu[i - 1].score){
 r = i + 1;
}
//pritnf之类或者stu[i].r = r;

6、这招不错,顶一个int型变量,没读入一个考生,就让num自增,当读取完一个考场的考生信息,(假设该考场有k个考生)后,这个考场的考生所对应的数组下标区间为【num - k,num)


输入:
1、考场数
2、考场人数
3、考生号+分数(13位+0~100分
考场小于100个,每个考场小于300人

输出:
registration_number final_rank location_number local_rank
以分数排序,如果分数相同,则考生号以字典序小的排序
同样分数同样内的排名

编程思想:
1、结构体数组:准考证,分数,考场号,考场内的排名,总排名,30010个,

输入考场号,然后输入每个考场内考生,注意把结构体数组标记考场号
然后排序考场内的
2、
再排序总的,然后输出总的,输出各项数据
注意:因为二维数组不知道如何给序号,所以整个复制过来再排序

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

struct student{
    char id[15];//考生号
    int score; //分数
    int test_location;//考场号
    int local_rank; //考场内排名
    int final_rank; //总排名
}stu[101][301], stu1[30001]; //前面考场号,后面考生号比较好!


bool cmp(student a, student b) { //比较函数,按分数排名,如果相同,则按字典序从大到小  (!!!)名词跟数组名字冲突了
    if (a.score != b.score) return a.score > b.score;
    else return strcmp(a.id, b.id) < 0;
}

int main()
{
    int total;
    cin >> total; //几个考场
    //int sum = 0; 统计总人数
    int sum[101];//累计总人数数组
    

    for (int i = 0;i < total;++i) { //(!!!)太笨了,用一个循环啊!
        int local;
        cin >> local; //人数
        //sum += local; 每次输入人数还要累加总人数,不能这么做,用一个数组来把每个考场的人数添加进来
        sum[i] = local;

        for (int j = 0;j < local;++j) {
            cin >> stu[i][j].id >> stu[i][j].score; //输入id和分数
            stu[i][j].test_location = i + 1; //修改考场号
        }

        
        sort(stu[i], stu[i] + local, cmp);//考场内排序   (!!!)应该可以的

        stu[i][0].local_rank = 1; //(!!!)得出考场内排名,注意,排序跟得出序号是完全不一样的
        for (int k = 1;k < local;k++) { 
            //(!!!)得出排名的第一步,一定要弄第一个为1,然后k = 1开始
            if (stu[i][k].score == stu[i][k - 1].score) {
                stu[i][k].local_rank = stu[i][k - 1].local_rank;
            }
            else {
                stu[i][k].local_rank = k + 1; //(!!!)注意是k + 1;
            }
        }
    }

    int sum1 = 0;
    for (int i = 0;i < total;i++){ //累计总人数
        sum1 += sum[i];
    }


   //总排名的排序来一次,仍旧是,然后排名怎么弄,算了我直接再开一个数组好了,然后复制过来...
    /* 这个排序是错的!
    sort(student, student + sum1;cmp); //总的排序
    student[0][0].final_rank = 1;
    int z = 0;
    for (int j = 1;j < sum[j];++j) {  //(!!!)新花样,双重数组的排名,有点区别,应该让第一排单独一个循环,然后之后就是双重循环了
        if (student[z][j] == student[z][j - 1]) {
                student[z][j].final_rank = student[z].final_rank;
        }else{
                student[z][j].final_rank = j + 1;
        }
    }
    ++z;
    for (; z < total;z++) { //(!!!)总的排序我不会。。。、
        for(int j = 0;)
    }
    */

    int num = 0; //整个复制过来,并且总人数也知道了
    for (int i = 0;i < total;++i) {
        for (int j = 0;j < sum[i];++j) {
            stu1[num++] = stu[i][j];
        }
    }

    printf("%d\n", num); //输出人数
    sort(stu1, stu1 + num,cmp);
    int r = 1;
    for (int i = 0;i < num;i++) { //(!!!)不修改排名直接输出,也不错
        if (i > 0 && stu1[i].score != stu1[i - 1].score) {
            r = i + 1; //当前考生与上一个考生分数不同时,让r更新为人数+1
        }
        printf("%s ", stu1[i].id);
        printf("%d %d %d\n", r, stu1[i].test_location, stu1[i].local_rank);
    }
    return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容