考试总结

2021-3-13考试总结

一、病人排队
得分:0分(订正后100分)
题目描述
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:

老年人(年龄 >= 60岁)比非老年人优先看病。
老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
非老年人按登记的先后顺序看病。
病人年龄
分析:
1、本题考查结构体和排序;
2、应先判断人的年纪,在判断来的先后顺序;

具体做法:
1、struct一个结构体,结构体定义一个数组a,包含病人ID(string类型)和病人年龄(int类型),int变量n表示总人数;
2、输入n,循环输入病人id和年龄;
3、(重要) 双重循环排序,第一重i循环从后往前(方便比较年龄),第二重j循环从头到i(方便调整顺序),年龄大于六十的按照年龄排序(年龄相等按照来的顺序排序),年龄小于六十按照来袭的顺序排序;

for(int i=n;i>=1;i--) { for(int j=1;j<i;j++) { if((a[j].age<a[j+1].age) && (a[j].age>=60 || a[j+1].age>=60)) swap(a[j],a[j+1]); } }

4、按照排好的顺序输出。

二、乒乓球

得分:0分(订正后100分)

题目描述
国际乒联现任主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是 其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。

华华通过以下方式进行分析,首先将比赛中每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录(其中w表示华华获得一分,L 表示华华对手获得一分):WWWWWWWWWWWWWWWWWWWWWWLW在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。如果一局比赛刚开始,则此时比分为0比0。

你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。

输入格式
每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组成。

其中E表示比赛信息结束,程序应该忽略E之后的所有内容。

分析:
1、多行输入,用特殊的方法进行输入(0分就是卡在这里了);
2、十一分制和二十一分制,输出条件里还要有一条两数差大于等于2;
3、读到’E’要结束循环。

具体做法:
1、(重要) 输入多个字符串s,并且要把各个字符串加在一起;

string s1,s; while(cin>>s1) { s+=s1; }//注:这种输入方法在c++里用不了,只能在文件输入输出的情况下用

2、定义两个累加器,一个是小华的分数,另一个是对手的分数;
3、进行循环,如果读到‘W’,小华加一分,否则对手加一分(前提是排除‘E’);当两个计数器的值中比较大的那个大于11,并且两数差大于等于2,以两数比的形式输出这两个数(21分制就改一下大数的值就行)。
4、每次输出结束时都要清零计数器,并在循环外输出剩余的值(这里给出11分制的代码);

for(int i=0;i<s.size();i++) { if(s[i]=='W') zi++; else if(s[i]=='L') dui++; else if(s[i]=='E') break; if(/*zi+dui>=11引起来的这句话是没用的*/ && abs(zi-dui)>=2 &&(zi>=11 || dui>=11)) { cout<<zi<<":"<<dui<<endl; zi=0; dui=0; } } cout<<zi<<":"<<dui<<endl; cout<<endl; zi=0; dui=0;

三、密室寻宝

得分:20分(订正后100分)

题目描述:
哈利・波特不经意间进入了一座古墓,古墓入口有一道大门,内部有六个密室,每个密室中藏有一件兵器。已知需要两个密码才能从里面打开密室和大门,取出密室内的兵器后从大门撤出。

两个密码均是不大于63的十进制整数,将其转化为八位二进制数后对应位进行“与”运算(运算的规则是:当两个位均为“1”时,结果为“1”,否则结果为“0”)。将“与”运算的结果从右往左数,当第n位为1时,表示可以打开第n个密室,取出其中的兵器;只有当取到至少两件兵器时,方可打开大门撤出。

现在哈利・波特任意给你两个密码,请你帮他设计一个程序,算算可以从哪些密室取出兵器,并可否从大门撤出。

分析:
1、十进制转二进制;
2、两数二进制的各数位的数进行比较;
3、判断数量并输出;
4、如果可以打开大门,代表有两件以上的密室可以打开,这时要输出密室的序号(从小到大)。

具体做法:
1、int函数,十进制转二进制;

int zhuaner(int d) { int sum=0,ans=1; while(d>0) { sum+=d%2*ans; d/=2; ans*=10; } return sum; }

2、定义两个数储存二进制数,再定义两个数组储存这两个数各位的数(逆序储存,让各个数位保持一致);
3、定义一个总数组,储存能开启密室的序号(在运行前务必要清零三个数组);

int p[10],q[10]; int lei[10]; int pe,qe; pe=zhuaner(p1); qe=zhuaner(q1); for(int i=1;i<=8;i++) { p[i]=0; q[i]=0; lei[i]=0; }//清零数组 for(int i=8;i>=1;i--) { if(pe>0) { p[i]=pe%10; pe/=10; } if(qe>0); { q[i]=qe%10; qe/=10; } }//转二进制后储存到数组里

4、开累加器,记录开启密室的数量,比较两个数组各位数字,如果相等,累加器加一,总数组储存编号;

int num=0; for(int i=8;i>=1;i--) { if(p[i]!=0 && p[i]==q[i]) { num++; lei[i]=abs(i-9); } else continue; }

5、判断能否打开大门以及能打开的密室的编号,输出。

if(num<2) { cout<<num<<endl<<"Close"; return 0; } else if(num>=2) { for(int i=8;i>=1;i--) { if(lei[i]!=0) { cout<<lei[i]<<' '; lei[i]=0; } } cout<<endl<<"Open"; }

__EOF__

本文作者best_brain
本文链接https://www.cnblogs.com/best-brain/p/18006590.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   best_brain  阅读(7)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示