算法笔记刷题日记——3.简单入门模拟 3.1简单模拟

刷题日记

3.1 简单模拟

此类题型根据题目描述进行代码的编写,考察代码能力,刷题记录如下:

  • B1001
  • B1032
  • B1016
  • B1026
  • B1046
  • B1008
  • B1012
  • B1018
  • A1042
  • A1046
  • A1065
  • B1010
  • A1002
  • A1009
错题记录

B1008 数组元素循环右移问题

一个数组_A_中存有_N_(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移_M_(≥0)个位置,即将_A_中的数据由(_A_0_A_1⋯_AN_−1)变换为(_AN_−_M_⋯_AN_−1_A_0_A_1⋯_AN_−_M_−1)(最后_M_个数循环移至最前面的_M_个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入_N_(1≤_N_≤100)和_M_(≥0);第2行输入_N_个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移_M_位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

思路分析:
1.出错点:需要注意题目中未说明m<n,m可能大于n

#include <bits/stdc++.h>
using namespace std;
int arr[110];
int main(){int n,m;scanf("%d %d",&n,&m);m=m%n;for(int i=1;i<=n;i++){scanf("%d",&arr[i]);}for(int i=m-1;i>=0;i--){printf("%d ",arr[n-i]);}for(int i=1;i<n-m;i++){printf("%d ",arr[i]);}printf("%d",arr[n-m]);return 0;
}

B1018 锤子剪刀布

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
image.png
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第 1 行给出正整数 N(≤105),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C 代表“锤子”、J 代表“剪刀”、B 代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。

输出格式:

输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。

输入样例:

10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

输出样例:

5 3 2
2 3 5
B B

思路分析:
1.本题容易出错的关键在于使用scanf("%c")的时候,%c会读入空格和换行,需要使用getchar()读入多余的换行符\n,我是在打印读入的符号的时候发现的,当时想到这一方面的原因是因为我一开始使用了函数帮助我判断谁赢了,但是函数传回的参很奇怪,所以才往这一方向尝试,后来才想到这一点。
2.优化的点:

  • 本题是循环相克的顺序,因此存在(k1+1)%3==k2这一方式判断输赢
  • 可以把字母转化为数字,会简单很多
#include <bits/stdc++.h>
using namespace std;
int jia[3],yi[3];
int l1[128],l2[128];
int main(){int n;char a,b;scanf("%d",&n);getchar();while(n--){scanf("%c %c",&a,&b);getchar();if(a=='C'&&b=='J'||a=='J'&&b=='B'||a=='B'&&b=='C'){jia[0]++;yi[2]++;l1[a]++;}else if(a=='C'&&b=='C'||a=='J'&&b=='J'||a=='B'&&b=='B'){jia[1]++;yi[1]++;}else if(a=='C'&&b=='B'||a=='J'&&b=='C'||a=='B'&&b=='J'){jia[2]++;yi[0]++;l2[b]++;}}printf("%d %d %d\n",jia[0],jia[1],jia[2]);printf("%d %d %d\n",yi[0],yi[1],yi[2]);char list[3]={'B','C','J'};int max1=0,max2=0;for(int i=0;i<3;i++){char temp=list[i];if(l1[temp]>max1){a=temp;max1=l1[temp];}if(l2[temp]>max2){b=temp;max2=l2[temp];}}printf("%c %c",a,b);return 0;
}
#include <bits/stdc++.h>
using namespace std;
int change(char x){if(x=='B')return 0;if(x=='C')return 1;if(x=='J')return 2;
}
int jia[3],yi[3];
int m1[3],m2[3];
int main(){char list[3]={'B','C','J'};int n;scanf("%d",&n);getchar();char a,b;int a_,b_;while(n--){scanf("%c %c",&a,&b);getchar();a_=change(a);b_=change(b);if((a_+1)%3==b_){jia[0]++;yi[2]++;m1[a_]++;}if(a_==b_){jia[1]++;yi[1]++;}if((a_+2)%3==b_){yi[0]++;jia[2]++;m2[b_]++;}}printf("%d %d %d\n",jia[0],jia[1],jia[2]);printf("%d %d %d\n",yi[0],yi[1],yi[2]);int i1=0,i2=0;for(int i=0;i<3;i++){if(m1[i]>i1){i1=m1[i];a=list[i];}if(m2[i]>i2){i2=m2[i];b=list[i];}}printf("%c %c",a,b);return 0;
}

A1042 Shuffling Machine

前言:本题我虽然做出来了,但是在做的过程中我有参考答案,因此这道题的思路也记录一下。

#include <bits/stdc++.h>
using namespace std;
int main(){int order[55];int list1[55];int list2[55];char list_[5]={'S','H','C','D','J'};int k;scanf("%d",&k);for(int i=1;i<=54;i++){scanf("%d",&order[i]);list1[i]=i;}while(k--){for(int i=1;i<=54;i++){list2[order[i]]=list1[i];}for(int i=1;i<=54;i++){list1[i]=list2[i];}}for(int i=1;i<=54;i++){if(i!=1) printf(" ");list1[i]--;printf("%c%d",list_[list1[i]/13],list1[i]%13+1);}return 0;
}

思路分析:
1.这题与B1018 锤子剪刀布有一些类似,它们都有以下特点:存在一定顺序(B1018是循环相克顺序,本题是字母与序号存在顺序关系)->可以将字母统一转换为数字,方便计算

A1065 A+B and C (64bit)

前言:这题的解法我真是一点思路木有,属于是计组和数据结构的完美结合了,在下佩服;但如果要我硬写的话,我可能会用大数加减来解决这道题,但对这题来说有属于是稍微的杀鸡用牛刀了一些。

Given three integers A, B and C in (−263,263), you are supposed to tell whether A+B>C.

Input Specification:

The first line of the input gives the positive number of test cases, T (≤10). Then T test cases follow, each consists of a single line containing three integers A, B and C, separated by single spaces.

Output Specification:

For each test case, output in one line Case #X: true if A+B>C, or Case #X: false otherwise, where X is the case number (starting from 1). Each line should ends with ‘\n’.

思路分析:
1.本题A B C的数据范围为[-2^63,2^63),需要用long long数据类型存储,但涉及到加法操作,一定会存在溢出的情况,即两个正数之和等于负数或两个负数之和等于正数。
2.溢出情况的分析,A+B的最大值是2^64-2,对应在long long数据类型变量中存储的值是(2^64-2)%2^64=-2,而A+B正溢出的取值范围易得[-2^63,-2],所以当A>0 B>0 A+B<0为正溢出,为true;反之,A+B的最小值是-2^64,存储值是-2^64%2^64=0,所以当A<0 B<0 C>=0为负溢出,为false。
3.值得注意的是,A+B溢出情况下,属于程序的未定义行为,此时的结果不一定是long long类型的,因此为了能够和C比较,我们需要把它存储在res中。

#include <bits/stdc++.h>
using namespace std;
int main(){int t;scanf("%d",&t);for(int i=1;i<=t;i++){long long a,b,c;scanf("%lld %lld %lld",&a,&b,&c);long long res=a+b;bool flag;if(a>0&&b>0&&res<0) flag=true;else if(a<0&&b<0&&res>=0) flag=false;else if(res>c) flag=true;else if(res<=c) flag=false;if(flag) printf("Case #%d: true\n",i);else printf("Case #%d: false\n",i);}return 0;
}

坑题记录

B1010 一元多项式求导

前言:本题虽然不难,但是我卡了许久,或许是因为太久没有接触数学微分了,求导都没意识到常数求导结果是0,以及一些意想不到的bug,故此记录一下本题。

设计函数求一元多项式的导数。(注:xn(_n_为整数)的一阶导数为_nxn_−1。)

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。

#include <bits/stdc++.h>
using namespace std;
int arr[1005];
int main(){int a,b;int num=0;while(scanf("%d %d",&arr[2*num+1],&arr[2*num+2])!=EOF){num++;}int out=0;for(int i=0;i<num;i++){if(arr[2*i+2]==0&&num==1){printf("0 0");}else if(arr[2*i+2]==0&&num!=1){continue;}else{if(out!=0) printf(" ");out++;printf("%d %d",arr[2*i+1]*arr[2*i+2],arr[2*i+2]-1);}}return 0;
}

思路分析:
1.常数的导数是0,故对应的系数项和指数项都是0
2.特殊情况当无非零多项式的时候,需要输出0 0
3.当有非零多项式和常数项同时存在的时候,常数项不需要输出
扩展:指数乘法需要考虑数组长度变化

A1002 A+B for Polynomials

前言:本题思路正确,然鹅,坑点竟然是我之前看过但又没有仔细考虑的浮点数加减问题,所以特此记录一下浮点数坑点的相关知识。
浮点数加减:
eps=1e-8
== fabs(a-b)<eps 需要注意的是,fabs取绝对值非常重要,这也是我踩坑的原因
> (a-b)>eps
< (a-b)<-(eps)
>= (a-b)>-(eps)
<= (a-b)<(eps)

3.1 简单模拟 刷题总结 易错点分析

1.int long long类型变量的数据范围
int的数据范围是[-2^31,2^31-1],数量级范围为[-2*10^9,2*10^9]
long long的数据范围是[-2^63,2^63-1],数量级范围为[-9*10^18,9*10^18]
2.输出变量名错误,手误,复制粘贴的时候尤其容易犯这错误
3.边界情况的考虑B1008
4.字母与数字的转换,A1042B1018的总结,如果涉及到字母和数字的结合处理,同时字母存在一定的规律,可以考虑把字母转换为数字,统一运算。
5.空格读入,在读入数字的时候其实不用考虑这一问题,但是当题目的输入有字符的时候,需要格外注意:

  • %c可以读入空格和换行符
  • getchar()可以读入空格和换行符,常用于读取换行符,常见应用如下

输入样例
2
A B

scanf("%d",&n);
getchar();
scanf("%c %c",&a,&b);
getchar();

6.A1065题溢出情况
溢出的判定:正数相加得到负数,发生正溢出;负数相加得到正数,发生负溢出
溢出范围的确定:2^64-2(最大值)%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/667929.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[机缘参悟-145] :一个软件架构师对佛学的理解 -9- 修行的目标和层次:净心、智慧和解脱

目录 前言&#xff1a; 第一层次&#xff08;小乘&#xff09;&#xff1a;净心&#xff0c;摆脱痛苦和烦扰&#xff0c;进入平静和安宁 1.1 什么是净心 1.2 如何达到净心的状态 1.3 "常乐我净" 第二层次&#xff08;中乘&#xff09;&#xff1a;智慧&#xf…

SpringMVC精简知识点

SpringMVC 数据格式化基本数据类型和字符串自动转换特殊数据类型和字符串自动转换 验证及国际化应用实例注意事项和使用细节注解的结合使用数据类型转换校验核心类-DatBinder取消某个属性的绑定中文乱码解决处理json和HttpMessageConverter<T>作业布置SpringMVC文件上传自…

【Linux】进程间通信 --管道通信

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 0. 进程间通信原理1. 匿名管道1.1 通信原理1.2 接口介绍 2. 命名管道2.1 接口介绍 3. 共享内存3.1 通信原理3.2 接口介绍 0. 进…

用户访问一个购物网站时TCP/IP五层参考模型中每一层的功能

当用户访问一个购物网站时&#xff0c;网络上的每一层都会涉及不同的协议&#xff0c;具体网络模型如下图所示。 以下是每个网络层及其相关的协议示例&#xff1a; 物理层&#xff1a;负责将比特流传输到物理媒介上&#xff0c;例如电缆或无线信号。所以在物理层&#xff0c;可…

Dell服务器iDRAC9忘记密码, 通过RACADM工具不重启 重置密码

系列文章目录 文章目录 系列文章目录前言一、RACADM工具二、linux环境1.解压安装RACADM工具测试RACADM工具重置iDRAC密码 Windows环境 前言 一、RACADM工具 RACADM工具 官网参考信息 https://www.dell.com/support/kbdoc/zh-cn/000126703/%E5%A6%82%E4%BD%95-%E9%87%8D%E7%BD…

计算机网络-封装成帧透明传输(组帧方法)

文章目录 数据链路层功能概述封装成帧透明传输组帧方法字符计数法字符填充法零比特填充法违规编码法 字符填充法为啥复杂和不兼容 数据链路层功能概述 类似老板让小秘书送文件给别的公司&#xff0c;小秘书告诉傻子怎么把该文件送到别的公司的小秘书&#xff0c;然后别的公司的…

修改UnityEngine dll

修改UnityEngine dll 由于有些版本的dll与热重载并不兼容&#xff0c;需要小幅修改代码。 使用dnspy工具 我们使用 dnspy 来修改 dll文件。而dnspy只能在Win下运行&#xff0c;故哪怕是mac版本dll&#xff0c; 你也得先将相应dll复制到Win下后再修改。下载 dnspy&#xff0c…

FastAdmin青动CRM-E售后

应用介绍 一款基于FastAdminThinkPHP和uniapp开发的CRM售后管理系统&#xff0c;旨在助力企业销售售后全流程精细化、数字化管理&#xff0c;主要功能&#xff1a;客户、合同、工单、任务、报价、产品、库存、出纳、收费&#xff0c;适用于&#xff1a;服装鞋帽、化妆品、机械机…

服务器使用过程中遇到常见故障及解决方案(包括蓝屏死机、无法删除的文件如何清理、网络卡、服务器连接不上等)

互联网时代&#xff0c;服务器的安全性和稳定性尤为重要&#xff0c;支撑着整个互联网行业的信息和数据安全。最近经常有客户咨询服务器的日常故障排除方法。由于服务器复杂的硬件结构和繁琐的运行原理&#xff0c;经常会出现这样那样的问题&#xff0c;有时即使是最小的问题也…

item_get_video-获取视频详情(bili.item_get_video)

B站&#xff08;Bilibili&#xff09;的item_get_video API用于获取视频的详细信息。通过调用该API&#xff0c;您将能够获得视频的基本信息、元数据、播放链接等。这使得开发者可以轻松地将B站视频集成到自己的应用程序或网站中&#xff0c;为用户提供更丰富的内容和更好的体验…

2-12 SDATR的训练与测试

2.12 SDATR的训练与测试 使用环境:3卡服务器SDATR 服务器代码地址:/home/lihuanyu/code/036SDATR 本地代码地址:F:\BaiduNetdiskDownload\code\036SDATR 2.12.1 训练文件修改 输入数据修改 载入词汇修改 短点保存修改 权重保存修改 其他位置修改:

springboot果蔬配送商城

技术架构&#xff1a; java mysql bootstrap jquery mybatis springboot 有需要该项目的小伙伴可以私信我你的Q。 功能介绍&#xff1a; 系统基于Java技术进行开发&#xff0c;后台数据库使用MySQL&#xff0c;在Windows环境下使用idea开发工具进行开发&#xff0c;主…

【计算机网络基础篇】学习笔记系列之二《游览器输入URL后发生了什么?》

文章目录 1&#xff0c;问题提出2&#xff0c;输入URL过程用到的协议3&#xff0c;输入URL过程分析3.1&#xff0c;孤单小弟 - HTTP3.2&#xff0c;真实地址查询 - DNS3.2&#xff0c;指南好帮手 - 协议栈3.3&#xff0c;可靠传输 - TCP3.4&#xff0c;远程定位- IP3.5&#xf…

陶哲轩如何用 GPT-4 辅助数学研究

关于陶哲轩&#xff08;Terence Tao&#xff09;用 GPT-4 进行数学研究的话题始于陶本人在 微软 Unlocked 上发表的 Embracing Change and Resetting Expectations 一文。文中提到&#xff1a; …… I could feed GPT-4 the first few PDF pages of a recent math preprint and…

[学习笔记]刘知远团队大模型技术与交叉应用L6-基于大模型文本理解和生成介绍

介绍 NLP的下游运用可以分为&#xff1a;NLU(理解)和NLG(生成) 信息检索&#xff1a;NLU 文本生成&#xff1a;NLG 机器问答&#xff1a;NLUNLG 大模型在信息检索 大模型在机器问答 大模型在文本生成 信息检索-Information Retrieval (IR) 背景 谷歌搜索引擎目前同时集成了…

Docker 可视化工具

1、Portainer 概念介绍 Portainer是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便地管理Docker环境&#xff0c;包括单机环境和集群环境。 Portainer分为开源社区版&#xff08;CE版&#xff09;和商用版&#xff08;BE版/EE版&#xff09;。 Porta…

嵌入式学习第十六天!(Linux文件查看、查找命令、标准IO)

Linux软件编程 1. Linux&#xff1a; 操作系统的内核&#xff1a; 1. 管理CPU 2. 管理内存 3. 管理硬件设备 4. 管理文件系统 5. 任务调度 2. Shell&#xff1a; 1. 保护Linux内核&#xff08;用户和Linux内核不直接操作&#xff0c;通过操作Shell&#xff0c;Shell和内核交互…

idea常用设置

1、内存优化 根据自己电脑本身的内存&#xff0c;对idea安装包里bin目录下的idea64.exe.vmoptions文件进行修改 -server -Xms256m -Xmx2048m -XX:MaxPermSize1024m -XX:ReservedCodeCacheSize256m -ea -Dsun.io.useCanonCachesfalse -Djava.Net.preferIPv4Stacktrue -Djsse.e…

CSS:水平垂直居中

公共的 CSS 样式&#xff1a; .parent {width: 300px;height: 300px;background-color:#d0e4fe; }.child {width: 100px;height: 100px;background-color:orange; }HTML: <div class"parent"><div class"child"></div> </div>最…

docker-compose部署laravel项目实战(主机nginx连接项目容器)(详细配置过程)

我用的是主机上的nginx,没有用docker安装nginx&#xff0c; 所以需要先在主机上安装nginx # 更新系统yum sudo yum update# 安装安装包sudo yum install epel-release sudo yum install wget# 安装Nginx sudo yum install nginx #启动 sudo systemctl start nginx #开机自启动…