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

news2024/11/27 6:35:15

刷题日记

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.coloradmin.cn/o/1433116.html

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

相关文章

C语言小游戏:贪吃蛇(游戏开发的环境和功能介绍)

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 生命不停&#xff0c;学习不止。铁汁们&#xff0c;我是大伟&#xff0c;欢迎来到大伟的游戏时间&#xff0c…

【论文阅读笔记】InstantID : Zero-shot Identity-Preserving Generation in Seconds

InstantID:秒级零样本身份保持生成 理解摘要Introduction贡献 Related WorkText-to-image Diffusion ModelsSubject-driven Image GenerationID Preserving Image Generation Method实验定性实验消融实验与先前方法的对比富有创意的更多任务新视角合成身份插值多身份区域控制合…

【遥感入门系列】遥感电磁辐射与遥感过程

遥感电磁辐射是比较难理解也是非常重要的内容&#xff0c;对于一般学习遥感专业的人来说&#xff0c;只需要学习个大概&#xff0c;这个大概主要包括你需要理解几个概念以及能从电磁辐射原理上解释一些遥感现象&#xff0c;进而为遥感过程的理解打下一个基础&#xff0c;如果你…

85.如何设计高并发系统(缓存、限流、熔断、降级)

文章目录 一&#xff1a;简介二&#xff1a;什么是高并发1、高并发的定义2、高并发的特点3、高并发场景和应用4、高并发的影响 三&#xff1a;高并发应对策略四&#xff1a;缓存1、浏览器缓存2、客户端缓存3、CDN缓存4、反向代理缓存5、本地缓存6、分布式缓存7、缓存问题8、缓存…

【代码随想录-哈希表】两个数组的交集

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

STM32搭建开发环境

常用开发工具简介 集成开发环境 MDK&#xff1a;全名RealViewMDK&#xff0c;是Keil公司&#xff08;已被ARM收购的&#xff09;一款集成开发环境&#xff0c;界面美观&#xff0c;简单易用&#xff0c;是STM32最常用的集成开发环境EWARM&#xff1a;IAR公司的一款集成开发环…

Go语言Gin框架安全加固:全面解析SQL注入、XSS与CSRF的解决方案

前言 在使用 Gin 框架处理前端请求数据时&#xff0c;必须关注安全性问题&#xff0c;以防范常见的攻击。本文将探讨 Gin 框架中常见的安全问题&#xff0c;并提供相应的处理方法&#xff0c;以确保应用程序的稳健性和安全性。 处理前端请求数据时&#xff0c;确保应用程序的…

MFC结构体写入文件和读取

先定义一个结构体&#xff1b; struct myTxc { char c; CString name; int value; } txc; 读和写的菜单代码&#xff1b; void CjgtrwView::On32771() {// TODO: 在此添加命令处理程序代码CFile file(_T("test1.txt"), CFile::modeCreate | CFile::mod…

【Java 数据结构】String进阶

字符串常量池 1. 创建对象的思考2. 字符串常量池(StringTable)3. 再谈String对象创建 1. 创建对象的思考 下面两种创建String对象的方式相同吗&#xff1f; public static void main(String[] args) {String s1 "hello";String s2 "hello";String s3 …

Coil:Android上基于Kotlin协程的超级图片加载库

Coil&#xff1a;Android上基于Kotlin协程的超级图片加载库 1. coil简介 在当今移动应用程序的世界中&#xff0c;图片加载是一个不可或缺的功能。为了让应用程序能够高效地加载和显示图片&#xff0c;开发人员需要依赖于强大的图片加载库。而今天&#xff0c;我将向大家介绍…

SolidWorks 2023 使用操作流程

1. 把头 1.1. 新建零件 1.2. 新建草图 1.3. 拉升凸台 1.4. 等距实体 切换到锤头&#xff0c;新建草图&#xff0c;等距实体1mm 1.5. 拉升凸台 将上一个步骤的草图&#xff0c;进行特征拉升 1.6. 镜像处理 1.7. 圆角处理 1.8. 绘制凹槽 在锤子的侧面绘制草图 1.9. 挖出把手孔…

微信小程序课设(基于云开发)

微信小程序通过Laf云平台接入ChatGPT实现聊天&#xff0c;回答方式采用流式回答。 以下是图片展示其页面 回答次数通过卡密兑换 以下是对话页面的代码 <!--pages/content/content.wxml--><view class"container"><view class"div" hidde…

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

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

Redis -- set集合

挑战自己&#xff0c;每天进步一点点&#xff0c;成就将属于不停止脚步的你。 目录 Redis集合&#xff1f; 集合基本命令 sadd smembers sismember scard spop srandmember smove srem 集合间操作 sinter sinterstore sunion sdiff sdiifstore Redis集合&#…

Apple Vision Pro:新的隐私噩梦?

长期以来&#xff0c;苹果被誉为最注重隐私的科技公司之一&#xff0c;但如今&#xff0c;凭借售价 3499 美元的 Vision Pro&#xff0c;苹果可能已经打造出了一款终极监控机器。 作为苹果首款头戴式“空间计算”显示设备&#xff0c;号称将打造数字世界与物理世界交汇的新空间…

如何在本地部署chatGLM3

文章目录 1. 参考2. ChatGLM3 介绍3. 本地运行3.1 硬件配置3.2 下载ChatGLM3代码3.3 下载需要加载的模型3.4 运行大模型3.4.1 ChatGLM3目录介绍3.4.2 安装依赖3.4.2 综合demo演示3.4.3 启动对话模式工具模式代码解释器 4. 总结 前面一章节有讲到 基于MacBook Pro M1芯片运行ch…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItemGroup组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之MenuItemGroup组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、MenuItemGroup组件 该组件用来展示菜单MenuItem的分组。 子组件 无 接…

一次Kubernetes Pod内存异常导致的测试环境耗时异常问题排查过程

概述 在使用公司内部后台系统测试环境时发现一个请求加载慢的问题&#xff0c;简简单单的列表&#xff0c;查询MongoDB数据库&#xff0c;测试环境不过几百上千条数据而已&#xff0c;请求耗时居然高达5~6秒&#xff1a; 作为对比&#xff0c;生产环境的请求响应截图如下&…

flask+vue+python跨区通勤人员健康体检预约管理系统

跨区通勤人员健康管理系统设计的目的是为用户提供体检项目等功能。 与其它应用程序相比&#xff0c;跨区通勤人员健康的设计主要面向于跨区通勤人员&#xff0c;旨在为管理员和用户提供一个跨区通勤人员健康管理系统。用户可以通过系统及时查看体检预约等。 跨区通勤人员健康管…

Leetcode834. 树中距离之和

Every day a Leetcode 题目来源&#xff1a;834. 树中距离之和 解法1&#xff1a;换根 DP 题解&#xff1a;【图解】一张图秒懂换根 DP&#xff01;&#xff08;Python/Java/C/Go/JS&#xff09; 暴力做法是&#xff0c;以点 i 为为树根&#xff0c;从 i 出发对树进行深度…