UVA12412 师兄帮帮忙 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang) 题解
Content
自己去看题面去。
Solution
算不上很繁琐的一道大模拟。
首先,既然是输出 \(0\) 才退出,那么在此之前程序应当会执行菜单 \(\Rightarrow\) 子操作 \(\Rightarrow\) 菜单 \(\Rightarrow\) 子操作 \(\Rightarrow\dots\) 直到你在菜单里面输入 \(0\)。因此我们可以写出这样的主体框架:
while(1) {
Menu();
int x; read(x);
if(!x) break;
if(x == 1) Add();
else if(x == 2) Remove();
else if(x == 3) Query();
else if(x == 4) Ranking();
else if(x == 5) Statistics();
}
然后我们对于每个函数具体将一下里头要注意的东西。
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
namespace Solution {
const double eps = 1e-5;
int cnt;
struct node {
string sid, name;
int id, cid, s1, s2, s3, s4, del, rk, sum;
int pass1, pass2, pass3, pass4, passnum;
}a[1007];
ib cmp1(const node& t1, const node& t2) {
if(t1.del != t2.del) return t1.del < t2.del;
return t1.sum > t2.sum;
}
ib cmp2(const node& t1, const node& t2) {
if(t1.del != t2.del) return t1.del < t2.del;
return t1.id < t2.id;
}
iv Sort() {
sort(a + 1, a + cnt + 1, cmp1);
int currk = 1, exactrk = 1;
F(int, i, 1, cnt) {
if(a[i].del) break;
if(i != 1 && a[i].sum != a[i - 1].sum) exactrk = currk;
a[i].rk = exactrk, currk++;
}
sort(a + 1, a + cnt + 1, cmp2);
}
iv Menu() {
puts("Welcome to Student Performance Management System (SPMS).");
puts("");
puts("1 - Add");
puts("2 - Remove");
puts("3 - Query");
puts("4 - Show ranking");
puts("5 - Show Statistics");
puts("0 - Exit");
puts("");
}
iv Add() {
while(1) {
string newsid, newname;
int newcid, news1, news2, news3, news4;
puts("Please enter the SID, CID, name and four scores. Enter 0 to finish.");
cin >> newsid;
if(newsid == "0") break;
cin >> newcid >> newname, read(news1, news2, news3, news4);
node tmp; int fl = 1;
tmp.sid = newsid, tmp.cid = newcid;
tmp.name = newname, tmp.s1 = news1;
tmp.s2 = news2, tmp.s3 = news3;
tmp.s4 = news4, tmp.del = 0;
tmp.sum = tmp.s1 + tmp.s2 + tmp.s3 + tmp.s4;
tmp.pass1 = (tmp.s1 >= 60);
tmp.pass2 = (tmp.s2 >= 60);
tmp.pass3 = (tmp.s3 >= 60);
tmp.pass4 = (tmp.s4 >= 60);
tmp.passnum = tmp.pass1 + tmp.pass2 + tmp.pass3 + tmp.pass4;
F(int, i, 1, cnt) if(!a[i].del && a[i].sid == newsid) {puts("Duplicated SID."), fl = 0; break;}
if(fl) tmp.id = ++cnt, a[cnt] = tmp;
Sort();
}
return;
}
iv Remove() {
while(1) {
string t;
puts("Please enter SID or name. Enter 0 to finish.");
cin >> t;
if(t == "0") break;
int delcnt = 0;
F(int, i, 1, cnt) if(!a[i].del && (a[i].sid == t || a[i].name == t)) a[i].del = 1, delcnt++;
printf("%d student(s) removed.\n", delcnt);
Sort();
}
return;
}
iv Query() {
while(1) {
string t;
puts("Please enter SID or name. Enter 0 to finish.");
cin >> t;
if(t == "0") break;
F(int, i, 1, cnt) if(!a[i].del && (a[i].sid == t || a[i].name == t)) {
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 << ' ';
printf("%.2lf\n", a[i].sum / 4.0 + eps);
}
}
return;
}
iv Ranking() {
puts("Showing the ranklist hurts students' self-esteem. Don't do that.");
return;
}
iv Statistics() {
puts("Please enter class ID, 0 for the whole statistics.");
int qcid; read(qcid);
int num = 0, sum = 0, passcnt = 0, failcnt = 0;
F(int, i, 1, cnt) if(!a[i].del && (a[i].cid == qcid || !qcid)) {
num++, sum += a[i].s1;
if(a[i].pass1) passcnt++;
else failcnt++;
}
puts("Chinese");
printf("Average Score: %.2lf\n", sum * 1.0 / num + eps);
printf("Number of passed students: %d\n", passcnt);
printf("Number of failed students: %d\n", failcnt);
puts("");
num = 0, sum = 0, passcnt = 0, failcnt = 0;
F(int, i, 1, cnt) if(!a[i].del && (a[i].cid == qcid || !qcid)) {
num++, sum += a[i].s2;
if(a[i].pass2) passcnt++;
else failcnt++;
}
puts("Mathematics");
printf("Average Score: %.2lf\n", sum * 1.0 / num + eps);
printf("Number of passed students: %d\n", passcnt);
printf("Number of failed students: %d\n", failcnt);
puts("");
num = 0, sum = 0, passcnt = 0, failcnt = 0;
F(int, i, 1, cnt) if(!a[i].del && (a[i].cid == qcid || !qcid)) {
num++, sum += a[i].s3;
if(a[i].pass3) passcnt++;
else failcnt++;
}
puts("English");
printf("Average Score: %.2lf\n", sum * 1.0 / num + eps);
printf("Number of passed students: %d\n", passcnt);
printf("Number of failed students: %d\n", failcnt);
puts("");
num = 0, sum = 0, passcnt = 0, failcnt = 0;
F(int, i, 1, cnt) if(!a[i].del && (a[i].cid == qcid || !qcid)) {
num++, sum += a[i].s4;
if(a[i].pass4) passcnt++;
else failcnt++;
}
puts("Programming");
printf("Average Score: %.2lf\n", sum * 1.0 / num + eps);
printf("Number of passed students: %d\n", passcnt);
printf("Number of failed students: %d\n", failcnt);
puts("");
int cnt4 = 0, cnt3 = 0, cnt2 = 0, cnt1 = 0, cnt0 = 0;
F(int, i, 1, cnt) if(!a[i].del && (a[i].cid == qcid || !qcid)) {
cnt4 += (a[i].passnum == 4);
cnt3 += (a[i].passnum == 3);
cnt2 += (a[i].passnum == 2);
cnt1 += (a[i].passnum == 1);
cnt0 += (a[i].passnum == 0);
}
puts("Overall:");
printf("Number of students who passed all subjects: %d\n", cnt4);
printf("Number of students who passed 3 or more subjects: %d\n", cnt3 + cnt4);
printf("Number of students who passed 2 or more subjects: %d\n", cnt2 + cnt3 + cnt4);
printf("Number of students who passed 1 or more subjects: %d\n", cnt1 + cnt2 + cnt3 + cnt4);
printf("Number of students who failed all subjects: %d\n", cnt0);
puts("");
return;
}
iv Main() {
while(1) {
Menu();
int x; read(x);
if(!x) break;
if(x == 1) Add();
else if(x == 2) Remove();
else if(x == 3) Query();
else if(x == 4) Ranking();
else if(x == 5) Statistics();
}
return;
}
}
UVA12412 师兄帮帮忙 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang) 题解的更多相关文章
- 【例题4-6 uva12412】A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 训练编程的题. 原题中没有除0的数据,所以别担心你的代码是因为除0错了. 多半跟我一样. 也是因为没有+eps 就是比如你要算tot ...
- UVA 12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
题目链接:https://vjudge.net/problem/UVA-12412 题目大意 略. 分析 比较大规模的模拟,注意输入输出,浮点数精度,还有排名相同的输出顺序,还有一些边界情况处理. 代 ...
- HDU--杭电--4506--小明系列故事——师兄帮帮忙--快速幂取模
小明系列故事——师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- HDUOJ-----4506小明系列故事——师兄帮帮忙
小明系列故事——师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- HDU 小明系列故事——师兄帮帮忙 高速幂
小明系列故事--师兄帮帮忙 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- 4_6 师兄帮帮忙(UVa12412)(选做)
你好,我是外国语学院的本科生.正如你所知道的,编程是一个 在我们大学必修课,即使他/她的专业是远离计算机科学.我根本不喜欢这个 课程,因为我不擅长电脑,我不想有任何编程的尝试! 但我不得不做作业: ...
- hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
Problem Description 小明自从告别了ACM/ICPC之后,就開始潜心研究数学问题了,一则能够为接下来的考研做准备,再者能够借此机会帮助一些同学,尤其是美丽的师妹.这不,班里唯一的女生 ...
- HDU 4506 小明系列故事——师兄帮帮忙(二分快速幂)
题意:就是输入一个数组,这个数组在不断滚动,而且每滚动一次后都要乘以一个数,用公式来说就是a[i] = a[i-1] * k;然后最后一位的滚动到第一位去. 解题报告:因为题目中的k要乘很多次,达到了 ...
随机推荐
- 【JavaSE】IO(1)-- File类
File类 2019-07-01 22:41:42 by冲冲 在 Java 中,File 类是 java.io 包中唯一映射磁盘文件本身的对象.File类可以获取文件的相关信息(查看文件名.路径. ...
- IDEA生成doc文档-生成chm文档
首先,打开IDEA,并找到Tools -> Generate JavaDoc- 可供查询的chm比那些HTML页面好看多了. 如果您用过JDK API的chm文档,那么您一定不会拒绝接受其它第三 ...
- 《程序员漫画》| 萌新面试Google
Hello,大家好.今天的更新有点不一样.我给大家带来了一些程序员漫画.这些都是我自己画的哦.希望大家喜欢. 今天的漫画有简约的画风,也有一些写实的风格(漂亮MM总是有特殊待遇).不知道大家喜欢哪种呢 ...
- SpringBoot引入第三方jar的Bean的三种方式
在SpringBoot的大环境下,基本上很少使用之前的xml配置Bean,主要是因为这种方式不好维护而且也不够方便. 因此本篇博文也不再介绍Spring中通过xml来声明bean的使用方式. 一.注解 ...
- Codeforces 605D - Board Game(树状数组套 set)
Codeforces 题目传送门 & 洛谷题目传送门 事实上是一道非常容易的题 很容易想到如果 \(c_i\geq a_j\) 且 \(d_i\geq b_j\) 就连一条 \(i\to j\ ...
- DirectX12 3D 游戏开发与实战第十一章内容
仅供个人学习使用,请勿转载.谢谢! 11.模板 模板缓冲区(stencil buffer)是一种"离屏"(off-screen)缓冲区,我们可以利用它来实现一些效果.模板缓冲区.后 ...
- R语言与医学统计图形-【32】海盗图、词云图、日历图
1.海盗图 参数众多,其语法与基础包类似. 基础图. #devtools::install_github('ndphillips/yarrr') #install.packages('yarrr') ...
- (转载)java排序实现
Java实现几种常见排序方法 日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法. ...
- Elaticsearch(一)--基础原理及用法
一.基础概念 1.Elasticsearch简介 Lucene是Java语言编写的全文(全部的文本内容进行分析,建立索引,使之可以被搜索)检索引擎工具包(全文检索引擎的架构),用于处理纯文本的数据,提 ...
- Qt最好用评价最高的是哪个版本?
来源: http://www.qtcn.org/bbs/read-htm-tid-89455.html /// Qt4: 4.8.7 4.X 系列终结版本 Qt5 : 5.6 LT ...