1198: 考试排名(二)(结构体专题)

题目描述:
ACM 国际大学生程序设计竞赛,英文全称:ACM International Collegiate Programming Contest(ACM-ICPC 或 ICPC)是由美国计算机协会(ACM)主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。经过30多年的发展,ACM 国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛。一般就简称为 ACM 竞赛了(虽然照理来说应该简称成 ICPC 才对)。
ACM 竞赛的计分规则如下:
首先按照过题数排名,过题数相同的队伍按照罚时排名(罚时小的队伍排在前面),如果罚时也相同则认为名次相同(名次相同时在排名表上队伍 id 较小的队伍列在前面)。
对于罚时的计算。队伍总体的罚时等于该队各题的罚时之和。对于某题的罚时,如果这道题最后没有通过(没有正确提交),则这题的罚时为 0,否则这道题的罚时为:从比赛开始到该题第一次正确提交经过的时间 + 第一次通过之前的错误提交次数 * 20 分钟。
例如:某次考试一共8题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数,但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,耗去了时间a,同时,曾经错误提交了b次,因此对于下述输入数据:

则其排名从高到低应该是这样的:
Josephus 5 376
John 4 284
Alice 4 352
Smith 3 167
Bob 2 325
Bush 0 0

输入:
输入数据的第一行是考试题数n(1≤n≤12),每行数据描述一个学生的用户名(不多于10个字符的字串)以及对所有n道题的答题现状,其描述采用问题描述中的数量标记的格式,见上面的表格,提交次数总是小于100,AC所耗时间总是小于1000。 参加考试的人数不超过100人。

输出:
将这些学生的考试现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽,左对齐),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。

样例输入:
8
Smith -1 -16 8 0 0 120 39 0
John 116 -2 11 0 0 82 55(1) 0
Josephus 72(3) 126 10 -3 0 47 21(2) -2
Bush 0 -1 -8 0 0 0 0 0
Alice -2 67(2) 13 -1 0 133 79(1) -1
Bob 0 0 57(5) 0 0 168 -7 0

样例输出:
Josephus 5 376
John 4 284
Alice 4 352
Smith 3 167
Bob 2 325
Bush 0 0

代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h> //包含字符串转换函数,下面读入每道题分数时使用的字符串,需要用到该函数
#define SWAP(a,b,t){t = a; a = b; b = t;}
/*ac是通过量,time是总时间,ret是每道题所消耗时间*/
typedef struct student{char name[11];int ac, time, ret[13];
}STU;int Fatoi(char *s, char *p, STU a){char str[10];int j, k = 0, sum = 0;for(j = 0; s[j] != '('; j++){str[j] = s[j];}sum += atoi(str);memset(str,0,sizeof(str));for(j = 1; *(p+j) != ')'; j++){str[k++] = *(p+j);}str[k] = '\0';sum = sum + atoi(str)*20;return sum;
}
/**************************************************
这道题的主要思路如下:
1.循环读入name,再通过循环用字符串读入每道题消耗时间给s;
2.注意一下逻辑顺序:先判断该题是否完成;若完成,需要判断
是否存在罚时(带括号);
3.尽量让主函数代码简单易懂,便于逻辑的建立;
**************************************************/
int main()
{int n, i = 0, t, j;char *p;       //这里的指针用于题目完成时,是否存在括号的判断scanf("%d",&n);STU a[101], temp;char s[10];while(scanf("%s",a[i].name) != EOF){a[i].ac = 0;a[i].time = 0;memset(s,0,sizeof(s));for(t = 0; t < n; t++){scanf("%s",s);/*题目未完成时*/if(s[0] == '0' || s[0] == '-'){a[i].ret[t] = 0;continue;}/*题目完成时*/else if(isdigit(s[0]) && s[0] != '0'){a[i].ac ++;p = NULL;p = strchr(s,'(');/*当存在括号时,指针p的地址是'('的地址,若不存在时,指针p为空*/if(p == NULL)a[i].ret[t] = atoi(s);elsea[i].ret[t] = Fatoi(s,p,a[i]);a[i].time += a[i].ret[t];}}i++;}/*用冒泡循环来排序*/for(j = 0; j < i-1; j++){for(t = j+1; t < i; t++){if(a[j].ac < a[t].ac)SWAP(a[j],a[t],temp)else if(a[j].ac == a[t].ac){if(a[j].time > a[t].time)SWAP(a[j],a[t],temp)else if(a[j].time == a[t].time){if(strcmp(a[j].name,a[t].name) > 0)SWAP(a[j],a[t],temp)}}}}for(j =0; j < i; j++)printf("%-10s %2d %4d\n",a[j].name,a[j].ac,a[j].time);return 0;
}

总结反思:
1.当需要复杂判断的时候尽量让主函数简单明了,突出逻辑,在子函数中处理单一判断便于后期检查问题;
2.不清楚字符串状态,可以用memset(s,0,sizeof(s));来清零;
3.交换排序时也可以定义一个函数,让主函数更简单。

ZZULIOJ1198: 考试排名(二)(结构体专题)相关推荐

  1. 考试排名(结构体专题)

    考试排名(结构体专题) 题目描述 今天浙大研究生复试的上机考试跟传统笔试的打分规则相似,总共有n道题,每道题有对应分值,最后计算总成绩.现给定录取分数线,请你写程序找出最后通过分数线的考生,并将他们的 ...

  2. 1196: 数星星(二)(结构体专题)_福利:最新导数6大专题!高分段提分有困扰?听北大状元漫谈提分...

    这是一篇适合数学120分以上的高中生深度研读的随感.文末有福利! 振宇老师从教的十几年中,遇到高分段学生最大的困扰便是:130分以上每提一分便需要付出极大的努力.究其原因,便是思维不够严谨全面,无法拿 ...

  3. 向大佬学习C语言1198: 考试排名(二)(结构体专题)

    题目 1198: 考试排名(二)(结构体专题) 时间限制: 1 Sec 内存限制: 128 MB 提交: 3737 解决: 728ACM 国际大学生程序设计竞赛,英文全称:ACM Internatio ...

  4. 1198: 考试排名(二)(结构体专题)

    1198: 考试排名(二)(结构体专题) 题目描述 ACM 国际大学生程序设计竞赛,英文全称:ACM International Collegiate Programming Contest(ACM- ...

  5. 1197: 考试排名(一)(结构体专题)

    1197: 考试排名(一)(结构体专题) 时间限制: 1 Sec  内存限制: 128 MB 提交: 59  解决: 70 [提交] [状态] [讨论版] [命题人:eilene] 题目描述 今天浙大 ...

  6. 考试排名(一)(结构体专题)

    考试排名(一)(结构体专题) 题目描述 今天浙大研究生复试的上机考试跟传统笔试的打分规则相似,总共有n道题,每道题有对应分值,最后计算总成绩.现给定录取分数线,请你写程序找出最后通过分数线的考生,并将 ...

  7. 1481: 考试排名(一)(结构体专题)

    1481: 考试排名(一)(结构体专题) 1.描述 今天浙大研究生复试的上机考试跟传统笔试的打分规则相似,总共有n道题,每道题有对应分值,最后计算总成绩.现给定录取分数线,请你写程序找出最后通过分数线 ...

  8. 问题 C: 考试排名(一)(结构体专题)

    问题 C: 考试排名(一)(结构体专题) 时间限制: 1 Sec  内存限制: 128 MB 题目描述 今天浙大研究生复试的上机考试跟传统笔试的打分规则相似,总共有n道题,每道题有对应分值,最后计算总 ...

  9. ZZULI-1184 平面点排序(二)(结构体专题)

    1184: 平面点排序(二)(结构体专题) Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 1291   Solved: 630 Submit Sta ...

最新文章

  1. mysql like reverse_mysql 优化like查询
  2. ubuntu在系统启动logo过后无法进入桌面的处理方法
  3. tf.device()指定tensorflow运行的GPU或CPU设备
  4. 常用的正则表达式的运用--学习笔记(二)
  5. How AET fields are retrieved from backend
  6. 开启协程_软件特攻队|GCC10发布,GCC 11将支持C++20协程功能?
  7. 优云Monitor:开启数据中心主机运维的上帝视角
  8. IKVM.NET_第二篇_应用
  9. 2021年终总结——脚踏实地,为下一次腾飞积蓄力量
  10. 斐讯路由器K2弹广告-刷机过程
  11. Android新浪微博开发(一)授权认证
  12. 【后台技术】异步编程指北,问题和重点
  13. 小白 0-1 学习 app 开发,从配置到 hello world
  14. 网站资源文件下载不了怎么办?一个方法教你如何轻松扒下
  15. this.$watch(),this.$set(),this.$nextTick()={})
  16. [华为][Atlas]Ubuntu can‘t open file ‘/usr/lib/python3.7/py_compile.py解决办法总结
  17. TMS320F2837x开发例程使用手册
  18. BlueTooth蓝牙协议规范(四)
  19. esxi显卡给2个虚拟机_使用虚拟机ESXI,显卡直通VM,使一台实体机虚拟成HTPC、WEB服务器、NAS服务器等经验 - 小众知识...
  20. 史玉柱深度剖析:民营的13种“死法”

热门文章

  1. 对ActiveX控件进行注册
  2. gitbook 插件:Emoji 表情
  3. 非因解读 | DSP空间转录组技术揭示食管鳞状细胞癌三级淋巴样结构的预后价值及分子特征
  4. javascript中的getElementById、getElementsByName、getElementByTagName详解
  5. Kubernetes 2岁了,这个 Party 你一定要来!
  6. windowsXP服务详解
  7. 英语音标怎么发音 48个英语音标正确读法
  8. 移动端网页唤醒app
  9. HTTP响应头使用X-Content-Options、X-XSS-Protection、X-Frame-Options
  10. 针对各组的意见,除评论员外的四个人的反思和改进