题意:

给定一次PAT测试的成绩,要求输出考生的编号,总排名,考场编号以及考场排名。

分析:

  题意很简单嘛,一开始上来就,一组组输入,一组组排序并记录组内排名,然后再来个总排序并算总排名,结果发现最后一个测试点超时。

  发现自己一开始太傻太盲目,其实只要一次性全部输进来,记录好考场编号,一次排序就可以了。既然只排了一次,怎么计算考场排名呢,这里我用了三个数组

int g_rank[];//记录各个考场当前排到的名次 (当前最后一个人的名次)
int g_score[];//记录个考场当前排到的最后一个人的分数
int g_num[];//记录个考场当前已经排好队的人数

帮助计算考场排名

        //计算分组排名
int p=a[i].num;//他属于第p组
if(g_rank[p]==){//如果他是本小组第一名
a[i].rank=;
g_rank[p]=;//当前组排到了第几名
g_score[p]=a[i].score;//本小组目前排下来最后一名的分数
g_num[p]=;//当前组排到了第几个人
}else{
g_num[p]++;//更新人数
if(g_score[p]==a[i].score) {//如果此人与本组的上一人的分数相同
a[i].rank=g_rank[p];//就是本小组上一名的名次
}else{//不同的话
a[i].rank=g_num[p];//那么他的名次是本组的人数
g_rank[p]=g_num[p];//更新当前本组最后一人名次
g_score[p]=a[i].score;//更新分数
}
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
struct node{
string name;
int score;
int num;
int rank;
int frank;
}a[];
bool cmp(node x,node y){
if(x.score==y.score){
return x.name<y.name;
}else{
return x.score>y.score;
}
}
int g_rank[];//记录各个考场当前排到的名次 (当前最后一个人的名次)
int g_score[];//记录个考场当前排到的最后一个人的分数
int g_num[];//记录个考场当前已经排好队的人数
int main(){
int n,k;
cin>>n;
int r=;
for(int i=;i<=n;i++){
cin>>k;
for(int j=;j<=k;j++){
cin>>a[r].name>>a[r].score;
a[r].num=i;//考场编号
r++;
}
}
sort(a+,a+r,cmp);
cout<<r-<<endl;
memset(g_rank,,sizeof(g_rank));
for(int i=;i<r;i++){
//全部排名
if(i==){
a[i].frank=;
}else{
if(a[i].score==a[i-].score){
a[i].frank=a[i-].frank;
}else{
a[i].frank=i;
}
}
//计算分组排名
int p=a[i].num;//他属于第p组
if(g_rank[p]==){//如果他是本小组第一名
a[i].rank=;
g_rank[p]=;//当前组排到了第几名
g_score[p]=a[i].score;//本小组目前排下来最后一名的分数
g_num[p]=;//当前组排到了第几个人
}else{
g_num[p]++;//更新人数
if(g_score[p]==a[i].score) {//如果此人与本组的上一人的分数相同
a[i].rank=g_rank[p];//就是本小组上一名的名次
}else{//不同的话
a[i].rank=g_num[p];//那么他的名次是本组的人数
g_rank[p]=g_num[p];//更新当前本组最后一人名次
g_score[p]=a[i].score;//更新分数
}
}
}
for(int i=;i<r;i++){
cout<<a[i].name<<" "<<a[i].frank<<" "<<a[i].num<<" "<<a[i].rank<<endl;
}
return ;
}

PAT 甲级1025 PAT Ranking (25 分)(结构体排序,第一次超时了,一次sort即可小技巧优化)的更多相关文章

  1. PAT 甲级 1028. List Sorting (25) 【结构体排序】

    题目链接 https://www.patest.cn/contests/pat-a-practise/1028 思路 就按照 它的三种方式 设计 comp 函数 然后快排就好了 但是 如果用 c++ ...

  2. PAT 乙级 1085. PAT单位排行 (25) 【结构体排序】

    题目链接 https://www.patest.cn/contests/pat-b-practise/1085 思路 结构体排序 要注意几个点 它的加权总分 是 取其整数部分 也就是 要 向下取整 然 ...

  3. PAT 甲级 1016 Phone Bills (25 分) (结构体排序,模拟题,巧妙算时间,坑点太多,debug了好久)

    1016 Phone Bills (25 分)   A long-distance telephone company charges its customers by the following r ...

  4. PAT 甲级 1025 PAT Ranking

    1025. PAT Ranking (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Programmi ...

  5. PAT甲级——1025 PAT Ranking

    1025 PAT Ranking Programming Ability Test (PAT) is organized by the College of Computer Science and ...

  6. 【PAT甲级】1070 Mooncake (25 分)(贪心水中水)

    题意: 输入两个正整数N和M(存疑M是否为整数,N<=1000,M<=500)表示月饼的种数和市场对于月饼的最大需求,接着输入N个正整数表示某种月饼的库存,再输入N个正数表示某种月饼库存全 ...

  7. PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习

    1020 Tree Traversals (25分)   Suppose that all the keys in a binary tree are distinct positive intege ...

  8. PAT 甲级 1146 Topological Order (25 分)(拓扑较简单,保存入度数和出度的节点即可)

    1146 Topological Order (25 分)   This is a problem given in the Graduate Entrance Exam in 2018: Which ...

  9. PAT 甲级 1071 Speech Patterns (25 分)(map)

    1071 Speech Patterns (25 分)   People often have a preference among synonyms of the same word. For ex ...

随机推荐

  1. 《图解HTTP》笔记2

    1.SSL(Secure Socket Layer,安全套接层) 1)SSL的作用 通信加密 确定通信方 SSL 提供认证和加密处理及摘要功能 HTTP 协议中没有加密机制,但可以通过和 SSL(Se ...

  2. 分享一波目前写的最强的autohotkey 插件

    支持各种软件快速切换,补全括号,代码等!!!!!!!! ;这种全局定义要写在所有代码的前面才能让所有代码起作用. SetCapsLockState , AlwaysOff SetNumlockStat ...

  3. Linux如何杀掉tty终端

    今天工作中遇到了同事的终端登陆不上去的问题,尝试着如何解决,首先想到的就是先干掉tty终端. 下面是总结的如何杀掉tty终端: 1.使用w命令查看当前登陆的用户及使用的tty [root@host ~ ...

  4. python2.7 psycopg2

    psycopg2 安装 sql='''INSERT INTO "CNYB"."PRE_DQ_PLANT"("ID", "ORG_I ...

  5. Miller-Rabin素性测试

    有时候我们想快速的知道一个数是不是素数,而这个数又特别的大导致 $O(\sqrt n)$ 的算法也难以通过,这时候我们可以对其进行 Miller-Rabin 素数测试,可以很大概率测出其是否为素数. ...

  6. Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)

    人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...

  7. .Net Core: 跨域Cros概要

    读取配置 public class AppConfig { public static IConfigurationRoot Configuration { get; set; } public st ...

  8. JavaScript有趣的知识点

    JavaScript中总有一些有趣的小知识,而且又是很容易犯错的.我把我遇到的慢慢罗列一下,方便大家避坑 typeof(null)返回的结果是 object " "变成布尔类型为t ...

  9. P2993 [FJOI2014]最短路径树问题

    思路:最短路+点分治 提交:2次 错因:更新桶的时候没有重置,而直接加上了. 题解: 对于构建最短路树,我们可以先跑最短路,然后dfs一遍连边. 然后就是点分治了,还是一些桶,存点数为\(x\)的最长 ...

  10. SSH远程连接排错的过程

    SSH远程连接排错的过程 http://note.youdao.com/noteshare?id=bc81e9036cd2067cb1857ca9f54299a7 补充 ping命令用来测试主机之间网 ...