2020级cpp机考模拟题A卷-#题解1
为了各位朋友的身心健康(不是),我们按照题目难度顺序来写题解。
第一次写题解,希望多点包容和鼓励(恬不知耻
1:谁先输出-4
题意:
输入3个整数,按从大到小的顺序输出,每两个数字间加一个空格。
题解:
输入三个数,用一下排序(冒泡/选择 排序法,或者 A?B:C),然后就可以输出了。
上板子(冒泡排序法):
for (int i = 1;i < n;i++)
{
for (int j = 1;j <= n - i;j++)
{
if (t[j] > t[j + 1])
swap(t[j], t[j + 1]);
}
}
13:星号阵列-16
题意:
上下拼接正方形,同位置重合只显示一条边。
题解:
可以看做输出b个,最后输出一行的星号。
上板子(使用循环):
int main()
{
int a, b;
cin >> a >> b;
for (int i = 1;i <= b;i++)
{
for (int j = 1;j <= a-1;j++)
{
if (j == 1)
{
for (int p = 1;p <= a;p++)
{
cout << "*";
}
cout << endl;
}
else
{
for (int p = 1;p <= a;p++)
{
if (p == 1 || p == a)cout << "*";
else cout << " ";
}
cout << endl;
}
}
}
for (int u = 1;u <= a;u++)
{
cout << "*";
}
cout << endl;
return 0;
}
3:最大的乘积
题意:
找两个数,使它们的乘积最大,然后输出这个乘积。
题解:
依题意,本题给的数据不一定是正数,所以需要通过排序找到最大的两个数跟最小的两个数,分别计算它们的乘积,输出较大的那个。
上板子(依然是冒泡排序法):
for (int i = 1;i < m;i++)
{
for (int j = 1;j <= m - i;j++)
{
if (a[j] > a[j + 1])
swap(a[j], a[j + 1]);
}
}//循环结束后,把最后的两个数与最前面的两个数的乘积比较一下,输出较大值。
9:沉迷游戏的大佬
题意:
给出经验总值与各级所需经验,求最终等级。
题解:
这题用循环解,每升一级把这一段所需要的经验减去,注意到了满级之后就不能升级了,所以在循环里特判一下是否满级。
上板子:
int n,x,d=1;//n为人物满级等级,x为经验总值,d为人物等级
cin >> n;
int a[1000] = { 0 };
for(int i=1;i<n;i++)
{
cin >> a[i];//升级所需经验
}
cin >> x;
int u = 1;//第几级升级到第几级
while (x >= a[u]&&d<n)//特判一下d是否<n,注意!不论你用for还是while,不能写<=。
{
x -= a[u];
d++;
u++;
}
/*这里如果用for,可写为
for(;x >= a[u]&&d<n;d++)
{
x-=a[u];
u++;
}*/
cout << d;
4:最长的妹纸序列
题意:
记录字符串中F最多连续个数。
题解:
录入一个字符串为男女生的队列,用循环依次判断字符是否为F,如果是则count++,如果不是就把count清零。
上板子(循环判断部分):
for (int i = 0;i < s.length();i++)
{
if (s[i] == 'F')num++;//连续的,下一个为女生,则数量加一
else//遇到男生
{
if (num > n)//假若此时的 num > n(n表示连续的最大值)
n = num; //num 就成为了新的最大值n
num = 0;//记得清零重新计数!!
}
}
if (num > n) n = num;//假如最后一段是最大值
cout << n << endl;
7:石头剪刀布
题意(开始应用题了,其实算法实现上很简单,然鹅你读不懂题目 /滑稽):
两个人石头剪刀布,其中A开了天眼能预先知道苏学长要出的是石头、剪刀还是布。但是A出石头、剪刀、布的次数有一个上限,石头最多出a次,剪刀最多出b次,布最多出c次(可以选择不出)。求A最多能赢几局。
题解:
题目里说了只需要求A最多赢几句,所以不用管她会输几局,然后简化题意之后这道题就会很简单。
就只要在B出剪刀的时候A出石头,所以A最多能赢的局数就只需要把A的石头次数与B的剪刀次数比较,输出较小值.....以此类推(剪刀跟布也用一样的方法算)......
上板子(真的挺简单的,建议自己看懂了做一遍):
string s;
cin >> s;
int a, b, c, o[4] = { 0 };// o 里面存储 b对应的剪刀、布、石头的次数。
cin >> a >> b >> c;
for (int i = 0;i < s.length();i++)
{
if (s[i] == 'j')o[1]++;
else if (s[i] == 'b')o[2]++;
else if (s[i] == 's')o[3]++;
}
int sum = 0;
sum += min(o[1], a);// o[1] 代表的是剪刀, a 代表的是石头,min(o[1],a) 就是A玩家用石头最多能赢几句。
sum += min(o[2], b);
sum += min(o[3], c);
cout << sum << endl;
8:MJ刷题目
题意:
编程竞赛里有n道题目,MJ做第i道题目需要花费t[i]时间。在统计竞赛小分的时候,规定每道题目的小分是:从比赛开始时间到这道题目做出来经历的时间,而MJ的小分将会是每道题的小分之和。假设MJ能够在比赛结束前做出所有题目,并且可以任意调整做题顺序。他想要让自己的小分的值足够小,问小分的最小值是多少?
题解:
很快你就能发现(不是),要小分的值最小,应该把用时短的题目先写了。然后,聪明的你灵光一闪就又知道了,排序、循环后相加。
举个栗子:
假如两道题目,一道题目A用时2分钟,一道题目B用时5分钟。
依据题意,假如先做A,小分为2+(2+5)=9;假如先做B,小分为5+(5+2)=12。
由于每道题的用时里都有前面的用时和,拿第一题举例,这边建议是把第一题的用时乘以题量,就是整个计算中第一题的时间了。对于上面的栗子,我们用这样的方法就可以把它转为:2*2+5*1=9;
上板子(其实主要看题解):
int time = 0;
for (int i = 1;i <= n;i++)//个人习惯, 第一个数组里我一般不存东西,所以从1开始循环。
{
time += t[i] * (n-i+1);
}
cout << time;
10:毒虫养成记
题意:
把毒虫放进一个笼子里,让它们自相残杀,最后存活的毒虫就当成最厉害的毒虫。由于毒虫的毒性各有各的不同,即使很弱小的毒虫也有机会干掉很厉害的毒虫。当A毒虫干掉B毒虫以后,会把B毒虫毒性的一半(如果这个值是小数,则保留其整数部分)加入到自己的毒性中,让自己的毒性变得更强大。草原学姐把一堆毒虫装进了笼中,问最后幸存的毒虫最大的毒性是多少?
题解:
虽然通过的人很多,但是由于我在这里卡了一个小时,所以我把这题的位置往后放了。
依据题意,毒虫A杀了B就可以得到它一半的毒性,且遇到小数时直接取整所以不必考虑毒性为奇数。那么,假如A杀了B,A的毒性将表示为A+B/2。你很快就会发现(不是),由于自相残杀过程中,每一个死去的毒虫都会被浪费50%的毒性,而且这个毒性在后面可能还会被 /2 ,例如C杀了上面的A,那么C的毒性为C+A/2+B/4(你看,B的毒性又被浪费了25%)。所以呢你很快就能得到一个重要结论:
让毒性最强的虫子去杀掉所有的虫子
也就是说除了最强的那个虫子保留原先的毒性,其余 /2 后加进去,这样可以最小限度的浪费毒性。
具体操作:一次循环,找出最大值,其余/2,然后再用一次循环,把除以二之后的加进去。
ps:不知道需不需要啊,我特判了m(虫子数量)=1的情况。
上板子:
int m, a[120] = { 0 };
cin >> m;
if (m == 1)
{
cin >> m;
cout << m << endl;
continue;
}
else
{
for (int i = 1;i <= m;i++)
{
cin >> a[i];
}
int sum = 0;
for (int j = 1;j < m;j++)//排序一次,找出最大值,放在a [m]的位置。
{
if (a[j] > a[j + 1])
swap(a[j], a[j + 1]);
}
for (int i = 1;i < m;i++)//将除了最大的值以外都 /2。
{
a[i] /= 2;
}
for (int j = 1;j <= m;j++)//把 /2 之后的毒虫毒性存到最大的毒虫里。
{
sum += a[j];
}
cout << sum << endl;
}
6:大规模杀伤性好人卡
题意:
有一个叫01的学长整天被妹纸发好人卡。妹纸丢出的好人卡具有范围杀伤效果。离好人卡越远伤害越小,伤害计算公式是:好人卡的伤害-距离,如果这个值为负的,那么当成0,即没有伤害。
有一天,01被妹纸们堵在一条长度为m的直线道路上,妹纸们对01发了很多张好人卡,每张好人卡具有各自的伤害值以及各自落下的位置。而01只能躲在整点的位置上(即0、1、2、...、m,一共m+1个候选位置),请你帮01找一个位置,让01受到的总伤害最小。
题解:
每一张好人卡的造成的伤害=好人卡的伤害-距离。这里要用到一个之前讲过的函数:abs,使用时记得加上它的头文件 #include<stdlib.h>,也就是abs(好人卡的位置-01学长的位置)。注意!表面上问的是你找个位置,最后输出的却是受到的最小伤害的值。
具体操作:
把每张好人卡的伤害存在数组a[ ]中,好人卡的位置存在数组b[ ]中。然后来一波循环for(int i=0;i<=m;i++)来找到最小伤害mi。
使用 INT_MAX 的话记得加上头文件#include<limits.h>当然你也可以手动输入一个很大的值,去赌它的样例不会比你的大。
上板子(上课讲了个 INT_MAX ,改一下原来的):
int m, p;
cin >> m >> p;
int a[502] = { 0 }, b[502] = { 0 }, c = 0, mi = INT_MAX;// mi 需要有一个初值,不然循环里无法比较。
for (int i = 1;i <= p;i++)
{
cin >> a[i];
}
for (int i = 1;i <= p;i++)
{
cin >> b[i];
}
for (int j = 0;j <= m;j++)
{
for (int i = 1;i <= p;i++)
{
if (a[i] > abs(b[i] - j))
c += (a[i] - abs(b[i] - j));//c 用于记录在 j 位置下受到的伤害的和。
}
mi = min(c, mi);
c = 0;//每次循环结束记得清零!
}
cout << mi << endl;
以上为#题解1的全部内容,后面的难题后面会另外再发一个。祝大家学习快乐!!
制作:BDT20040
2020级cpp机考模拟题A卷-#题解1的更多相关文章
- 2020级cpp机考模拟题A卷-#题解2
这部分的题目都有一定难度,有兴趣的同学可以钻研一下. 特此感谢来自BDT20030 tql的支持. 2:素数的和-2 题意: 计算不大于m的素数之和.(多么容易理解的题目啊,对吧) 题解(有点复杂的 ...
- 2020级C++实验课-期末机考模拟考题解
做这个题解的理由很简单,有很多同学想写但是不会写,凑巧我写了,所以搞个题解. 顺序就是题单里的顺序(界面左上角菜单切换文章,右上角目录方便查看) 1:黑马白马 题意: 随机得到一个数字,如果是偶数,则 ...
- 2020级cpp上机考试题解#B卷
A卷的第七题我只会一个个排除的方法 意思就是暂时没有好办法所以A卷不搞了 1:递归函数求数列 题意: 有一个递归函数int f(int m),计算结果代表了数列的第m项.当m等于1时,函数结果返回1: ...
- 【2-SAT】【并查集】NOIp模拟题 植树方案 题解
一个类似2-SAT的思想,但是简化了很多.只需要用到并查集实现. 题目描述 企鹅国打算种一批树.所谓树,就是由$N$个结点与$N-1$条边连接而成的连通无向图.企鹅国的国王对于这些树有下列要求 ...
- BUPT 2012复试机考 4T
题目描述 我们都学习过计算机网络,知道网络层IP协议数据包的头部格式如下: 其中IHL表示IP头的长度,单位是4字节:总长表示整个数据包的长度,单位是1字节.传输层的TCP协议数据段的头部格式如下: ...
- PMP全真模拟题真题試題含答案解析 2019年下半年PMP考試适用 PMP中文文对照试题 【香港台灣地區PMP考試也可用】
PMP全真模拟题真题试题 含答案解析 2019年下半年PMP考试适用 PMP中文文对照试题 [香港台灣地區PMP考試也可用]PMP全真模擬題真題試題 含答案解析 2019年下半年PMP考試适用 PMP ...
- 更新 | 2019年9月计算机二级office模拟题库
随着2019年上半年计算机二级考试的完美落幕,紧接着的便是9月份的考试了. 到目前为止,下半年9月份计算机二级考试报名开通时间在6月前后,现在也基本结束. 2019年9月(56次)全国计算机等级考试( ...
- 1+X Web前端开发(初级)理论考试样题(附答案)
传送门 教育部:职业教育将启动"1+X"证书制度改革 职业教育改革1+X证书制度试点启动 1+X成绩/证书查询入口 一.单选题(每题 2 分,共 60 分) 1.在 HTML 中, ...
- 全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
题目名称 正确答案 序列问题 长途旅行 英文名称 answer sequence travel 输入文件名 answer.in sequence.in travel.in 输出文件名 answer. ...
随机推荐
- USB3.0接口EMC设计标准电路
- 原理图Checklist
类别 描述 检视规则 原理图需要进行检视,提交集体检视是需要完成自检,确保没有低级问题. 检视规则 原理图要和公司团队和可以邀请的专家一起进行检视. 检视规则 第一次原理图发出进行集体检视后所有的修改 ...
- 无需Flash实现图片裁剪——HTML5中级进阶
前言 图片裁剪上传,不仅是一个很贴合用户体验的功能,还能够统一特定图片尺寸,优化网站排版,一箭双雕. 需求就是那么简单,在浏览器里裁剪图片并上传到服务器. 我第一个想到的方法就是,将图片和裁剪参数(x ...
- 前端架构gulp与webpack(知识点整理)
一 概念介绍 gulp 是 task runner,Webpack 是 module bundler.可以这么说, Webpack 和 gulp 本身都有 95% 的功能是不能被对方替代,或者直接说和 ...
- java中如何求出2008年的第1星期星期一是几号?
题目8: 2008年的第1星期星期一是几号? import java.util.*; public class Test { public static void main(String[] ...
- 关于Symbol.iterator 学习笔记
1.可以部署在对象上的一个遍历器 2. 遍历器是一个函数,需要返回一个含有一个next 方法的对象 const likeArray = {0:'a', 1: 'b', 2: 'c',3: 'd'. l ...
- Svelte3聊天室|svelte+svelteKit仿微信聊天实例|svelte.js开发App
基于svelte3.x+svelteKit构建仿微信App聊天应用svelte-chatroom. svelte-chatroom 基于svelte.js+svelteKit+mescroll.js+ ...
- echarts饼图禁止鼠标悬浮区块突出
禁止悬浮突出,在series内添加hoverAnimation:false即可 代码如下: option = { color:['#3498db','#EEEEEE'], series: [ { na ...
- Pinpoint介绍及docker安装方式
一.介绍 Pinpoint是用Java编写的大型分布式系统的APM(Application Performance Management应用程序性能管理)工具,受Dapper论文的启发,Pinpoin ...
- Win下GCC报错 error: ‘for’ loop initial declarations are only allowed in C99 mode
##报错## 用GCC编译for循环会出现以下错误 error: 'for' loop initial declarations are only allowed in C99 mode 如图所示: ...