Content

自己去看题面去。

Solution

算不上很繁琐的一道大模拟。

首先,既然是输出 \(0\) 才退出,那么在此之前程序应当会执行菜单 \(\Rightarrow\) 子操作 \(\Rightarrow\) 菜单 \(\Rightarrow\) 子操作 \(\Rightarrow\dots\) 直到你在菜单里面输入 \(0\)。因此我们可以写出这样的主体框架:

  1. while(1) {
  2. Menu();
  3. int x; read(x);
  4. if(!x) break;
  5. if(x == 1) Add();
  6. else if(x == 2) Remove();
  7. else if(x == 3) Query();
  8. else if(x == 4) Ranking();
  9. else if(x == 5) Statistics();
  10. }

然后我们对于每个函数具体将一下里头要注意的东西。

Part 0 Menu

这一部分确实比较容易,毕竟你只需要输出题目给你的那一大段东西即可。但要注意换行的问题!洛谷上面的样例吃掉了所有的空行,而 UVA 又是狠抓这里的,因此你需要按照题目要求的那样输出,不能够多或者少!这里建议直接对着题面复制粘贴输出内容,以防自己打的时候出错。另外,输入整数的时候需要时刻判断是否应该退出系统。

Part 1 Add

首先先输入一个字符串(不要全输入进去),用来判断其是否为 0 从而进一步判断是否应该退出。如果没有退出的话,之后就把所有的学生信息全部输入完整,然后再直接暴力查数据库里面还没有被删除的学生中是否有学生的学号和新学生的学号冲突,冲突了直接跳过这一次添加操作,否则直接加入数据库里面并标记没有被删除。

另外,为了在之后的 Query 部分中输出学生的排名较方便,我们每次改变数据库之后先把这些学生按照总分从大到小排序(注意还要将没有被删除的同学放在前面,以免出错),然后直接从第一个学生开始计算他的排名。具体地,我们有一个计数器 \(cnt\),初始值为 \(1\),每算完一个学生的排名它就加 \(1\)。然后我们只需要判断当前学生的总分是否和上一个学生的总分相等,相等的话他的排名就是上一个学生的排名,否则他的排名即为计数器 \(cnt\) 当前的值。计算完之后,一定要把数据库还原成初始状态,即按照学生加入数据库的先后顺序排序,以方便之后 Query 部分的输出。

Part 2 Remove

删除学生时直接暴力查数据库里面所有还没有被删除的学生当中,是否有学号或者名字对应上的,对应上了直接标记为被删除,并且计入删除总人数里面去。

同样的,在删除完以后同样也需要进行一次排序,具体见 Add 部分的介绍。

Part 3 Query

同样地,我们直接暴力查数据库里面所有还没有被删除的学生当中,是否有学号或者名字对应上的,对应上了的直接按题目要求输出所有信息即可。注意在输出平均分的时候,可能会有精度误差,可以像题目里面所提示的那样,加上一个很小的数以减小精度误差。

Part 4 Ranking

根据题目要求输出那一段我个人觉得感同身受的文字即可。

Part 5 Statistics

输入完班级号之后,我们直接查所有学生中班级号对应上的学生的信息(当然,如果输入的班级号是 \(0\),那么就查所有学生的信息),统计题目需要我们统计的东西然后按照题目要求的那样输出就行了。注意以下两点:

  • 建议还是直接复制粘贴题目里面的输出内容,以防自己打的时候出错(这题的大小写和标点符号的添加情况尤其恶心,一定要特别注意)。
  • 和 Query 部分相同,在输出平均分的时候,可能会有精度误差,可以像题目里面所提示的那样,加上一个很小的数以减小精度误差。

那么这道大模拟就写完了。还有什么不懂得欢迎在评论区留言或者直接私信我。

剩下的就是愉快地模拟了。

Code

  1. namespace Solution {
  2. const double eps = 1e-5;
  3. int cnt;
  4. struct node {
  5. string sid, name;
  6. int id, cid, s1, s2, s3, s4, del, rk, sum;
  7. int pass1, pass2, pass3, pass4, passnum;
  8. }a[1007];
  9. ib cmp1(const node& t1, const node& t2) {
  10. if(t1.del != t2.del) return t1.del < t2.del;
  11. return t1.sum > t2.sum;
  12. }
  13. ib cmp2(const node& t1, const node& t2) {
  14. if(t1.del != t2.del) return t1.del < t2.del;
  15. return t1.id < t2.id;
  16. }
  17. iv Sort() {
  18. sort(a + 1, a + cnt + 1, cmp1);
  19. int currk = 1, exactrk = 1;
  20. F(int, i, 1, cnt) {
  21. if(a[i].del) break;
  22. if(i != 1 && a[i].sum != a[i - 1].sum) exactrk = currk;
  23. a[i].rk = exactrk, currk++;
  24. }
  25. sort(a + 1, a + cnt + 1, cmp2);
  26. }
  27. iv Menu() {
  28. puts("Welcome to Student Performance Management System (SPMS).");
  29. puts("");
  30. puts("1 - Add");
  31. puts("2 - Remove");
  32. puts("3 - Query");
  33. puts("4 - Show ranking");
  34. puts("5 - Show Statistics");
  35. puts("0 - Exit");
  36. puts("");
  37. }
  38. iv Add() {
  39. while(1) {
  40. string newsid, newname;
  41. int newcid, news1, news2, news3, news4;
  42. puts("Please enter the SID, CID, name and four scores. Enter 0 to finish.");
  43. cin >> newsid;
  44. if(newsid == "0") break;
  45. cin >> newcid >> newname, read(news1, news2, news3, news4);
  46. node tmp; int fl = 1;
  47. tmp.sid = newsid, tmp.cid = newcid;
  48. tmp.name = newname, tmp.s1 = news1;
  49. tmp.s2 = news2, tmp.s3 = news3;
  50. tmp.s4 = news4, tmp.del = 0;
  51. tmp.sum = tmp.s1 + tmp.s2 + tmp.s3 + tmp.s4;
  52. tmp.pass1 = (tmp.s1 >= 60);
  53. tmp.pass2 = (tmp.s2 >= 60);
  54. tmp.pass3 = (tmp.s3 >= 60);
  55. tmp.pass4 = (tmp.s4 >= 60);
  56. tmp.passnum = tmp.pass1 + tmp.pass2 + tmp.pass3 + tmp.pass4;
  57. F(int, i, 1, cnt) if(!a[i].del && a[i].sid == newsid) {puts("Duplicated SID."), fl = 0; break;}
  58. if(fl) tmp.id = ++cnt, a[cnt] = tmp;
  59. Sort();
  60. }
  61. return;
  62. }
  63. iv Remove() {
  64. while(1) {
  65. string t;
  66. puts("Please enter SID or name. Enter 0 to finish.");
  67. cin >> t;
  68. if(t == "0") break;
  69. int delcnt = 0;
  70. F(int, i, 1, cnt) if(!a[i].del && (a[i].sid == t || a[i].name == t)) a[i].del = 1, delcnt++;
  71. printf("%d student(s) removed.\n", delcnt);
  72. Sort();
  73. }
  74. return;
  75. }
  76. iv Query() {
  77. while(1) {
  78. string t;
  79. puts("Please enter SID or name. Enter 0 to finish.");
  80. cin >> t;
  81. if(t == "0") break;
  82. F(int, i, 1, cnt) if(!a[i].del && (a[i].sid == t || a[i].name == t)) {
  83. cout << a[i].rk << ' ' << a[i].sid << ' ' << a[i].cid << ' ' << a[i].name << ' ' << a[i].s1 << ' ' << a[i].s2 << ' ' << a[i].s3 << ' ' << a[i].s4 << ' ' << a[i].sum << ' ';
  84. printf("%.2lf\n", a[i].sum / 4.0 + eps);
  85. }
  86. }
  87. return;
  88. }
  89. iv Ranking() {
  90. puts("Showing the ranklist hurts students' self-esteem. Don't do that.");
  91. return;
  92. }
  93. iv Statistics() {
  94. puts("Please enter class ID, 0 for the whole statistics.");
  95. int qcid; read(qcid);
  96. int num = 0, sum = 0, passcnt = 0, failcnt = 0;
  97. F(int, i, 1, cnt) if(!a[i].del && (a[i].cid == qcid || !qcid)) {
  98. num++, sum += a[i].s1;
  99. if(a[i].pass1) passcnt++;
  100. else failcnt++;
  101. }
  102. puts("Chinese");
  103. printf("Average Score: %.2lf\n", sum * 1.0 / num + eps);
  104. printf("Number of passed students: %d\n", passcnt);
  105. printf("Number of failed students: %d\n", failcnt);
  106. puts("");
  107. num = 0, sum = 0, passcnt = 0, failcnt = 0;
  108. F(int, i, 1, cnt) if(!a[i].del && (a[i].cid == qcid || !qcid)) {
  109. num++, sum += a[i].s2;
  110. if(a[i].pass2) passcnt++;
  111. else failcnt++;
  112. }
  113. puts("Mathematics");
  114. printf("Average Score: %.2lf\n", sum * 1.0 / num + eps);
  115. printf("Number of passed students: %d\n", passcnt);
  116. printf("Number of failed students: %d\n", failcnt);
  117. puts("");
  118. num = 0, sum = 0, passcnt = 0, failcnt = 0;
  119. F(int, i, 1, cnt) if(!a[i].del && (a[i].cid == qcid || !qcid)) {
  120. num++, sum += a[i].s3;
  121. if(a[i].pass3) passcnt++;
  122. else failcnt++;
  123. }
  124. puts("English");
  125. printf("Average Score: %.2lf\n", sum * 1.0 / num + eps);
  126. printf("Number of passed students: %d\n", passcnt);
  127. printf("Number of failed students: %d\n", failcnt);
  128. puts("");
  129. num = 0, sum = 0, passcnt = 0, failcnt = 0;
  130. F(int, i, 1, cnt) if(!a[i].del && (a[i].cid == qcid || !qcid)) {
  131. num++, sum += a[i].s4;
  132. if(a[i].pass4) passcnt++;
  133. else failcnt++;
  134. }
  135. puts("Programming");
  136. printf("Average Score: %.2lf\n", sum * 1.0 / num + eps);
  137. printf("Number of passed students: %d\n", passcnt);
  138. printf("Number of failed students: %d\n", failcnt);
  139. puts("");
  140. int cnt4 = 0, cnt3 = 0, cnt2 = 0, cnt1 = 0, cnt0 = 0;
  141. F(int, i, 1, cnt) if(!a[i].del && (a[i].cid == qcid || !qcid)) {
  142. cnt4 += (a[i].passnum == 4);
  143. cnt3 += (a[i].passnum == 3);
  144. cnt2 += (a[i].passnum == 2);
  145. cnt1 += (a[i].passnum == 1);
  146. cnt0 += (a[i].passnum == 0);
  147. }
  148. puts("Overall:");
  149. printf("Number of students who passed all subjects: %d\n", cnt4);
  150. printf("Number of students who passed 3 or more subjects: %d\n", cnt3 + cnt4);
  151. printf("Number of students who passed 2 or more subjects: %d\n", cnt2 + cnt3 + cnt4);
  152. printf("Number of students who passed 1 or more subjects: %d\n", cnt1 + cnt2 + cnt3 + cnt4);
  153. printf("Number of students who failed all subjects: %d\n", cnt0);
  154. puts("");
  155. return;
  156. }
  157. iv Main() {
  158. while(1) {
  159. Menu();
  160. int x; read(x);
  161. if(!x) break;
  162. if(x == 1) Add();
  163. else if(x == 2) Remove();
  164. else if(x == 3) Query();
  165. else if(x == 4) Ranking();
  166. else if(x == 5) Statistics();
  167. }
  168. return;
  169. }
  170. }

UVA12412 师兄帮帮忙 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang) 题解的更多相关文章

  1. 【例题4-6 uva12412】A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 训练编程的题. 原题中没有除0的数据,所以别担心你的代码是因为除0错了. 多半跟我一样. 也是因为没有+eps 就是比如你要算tot ...

  2. UVA 12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)

    题目链接:https://vjudge.net/problem/UVA-12412 题目大意 略. 分析 比较大规模的模拟,注意输入输出,浮点数精度,还有排名相同的输出顺序,还有一些边界情况处理. 代 ...

  3. HDU--杭电--4506--小明系列故事——师兄帮帮忙--快速幂取模

    小明系列故事——师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  4. HDUOJ-----4506小明系列故事——师兄帮帮忙

    小明系列故事——师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  5. hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  6. HDU 小明系列故事——师兄帮帮忙 高速幂

    小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  7. 4_6 师兄帮帮忙(UVa12412)(选做)

    你好,我是外国语学院的本科生.正如你所知道的,编程是一个  在我们大学必修课,即使他/她的专业是远离计算机科学.我根本不喜欢这个 课程,因为我不擅长电脑,我不想有任何编程的尝试!  但我不得不做作业: ...

  8. hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)

    Problem Description 小明自从告别了ACM/ICPC之后,就開始潜心研究数学问题了,一则能够为接下来的考研做准备,再者能够借此机会帮助一些同学,尤其是美丽的师妹.这不,班里唯一的女生 ...

  9. HDU 4506 小明系列故事——师兄帮帮忙(二分快速幂)

    题意:就是输入一个数组,这个数组在不断滚动,而且每滚动一次后都要乘以一个数,用公式来说就是a[i] = a[i-1] * k;然后最后一位的滚动到第一位去. 解题报告:因为题目中的k要乘很多次,达到了 ...

随机推荐

  1. final关键字、抽象类、抽象类和接口的区别

    1.final关键字 1.1.final修饰的类无法继承. 1.2.final修饰的方法无法覆盖. 1.3.final修饰的变量只能赋一次值. 1.4.final修饰的引用一旦指向某个对象,则不能再重 ...

  2. Docker 急速入门

    1. 概述 之前聊了很多 SpringCloud 相关的话题,今天我们来聊聊服务容器 Docker. 2. 在 CentOS7 安装 Docker 2.1 卸载旧版本的Docker  # yum re ...

  3. 从零开始学Kotlin第三课

    kotlin函数和函数式表达式的简化写法: fun main(args:Array<String>) { var result=add(2,5) println(result) ///简化 ...

  4. static关键字相关内容

    静态变量(static)与非静态变量,静态方法(static)与非静态方法 //static public class Student { private static int age; //静态的变 ...

  5. c++基础知识02

    1.前置与后置区别 #include<iostream> using namespace std; int main() { //前置和后置区别 //前置递增或递减 先让变量加减1 然后进 ...

  6. Codeforces 891D - Sloth(换根 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 换根 dp 好题. 为啥没人做/yiw 首先 \(n\) 为奇数时答案显然为 \(0\),证明显然.接下来我们着重探讨 \(n\) 是偶数 ...

  7. Codeforces 1464F - My Beautiful Madness(树的直径)

    Codeforces 题面传送门 & 洛谷题面传送门 树上数据结构大杂烩(?) 首先考虑什么样的点能够在所有路径的 \(d\) 邻居的交集内.显然如果一个点在一条路径的 \(d\) 邻居内则必 ...

  8. 洛谷 P3781 - [SDOI2017]切树游戏(动态 DP+FWT)

    洛谷题面传送门 SDOI 2017 R2 D1 T3,nb tea %%% 讲个笑话,最近我在学动态 dp,wjz 在学 FWT,而我们刚好在同一天做到了这道题,而这道题刚好又是 FWT+动态 dp ...

  9. JSOI2021 游记

    Day 0 - 2021.4.9 写一波最近的事情吧( 3 月 20 号出头 cnblogs 抽风,说 25 号恢复来着,我就囤了一堆博客在本地准备 25 号发,结果到时候就懒得动了.干脆越屯越多,省 ...

  10. PPT插件——iSlide全功能解析

    做幻灯展示是我们日常工作中不可缺少的一部分,有的人喜欢用代码如Latex, markdown+pandoc+revealjs 或 bookdown.这些都是自动化做幻灯的好工具.我也都有过体会,确实简 ...