(小球游戏王子闯闸门解题思路和源码)CSDN竞赛第68期编程题解+参赛感悟

news2024/10/5 14:39:28

2023年8月1日中午,正在排队等着购买午饭,手机弹出一条推送“CSDN比赛… …”,心中一亮,参加!

2023年8月2日18:50,带着空空的肚子,坐在电脑前,等待开赛。(为什么句句不离吃つ﹏,我真的不是一个吃货啊)

19点准时开赛,1个判断、2个选择、1个填空,共40分,都是关于编码理论知识的,而有猫彬同学毫无基础,蒙蒙猜猜,终得20。赛后就有点想读下比赛推荐书目了,补充下自己的知识盲区。

接着到了最喜欢的2个编程题目,共60分。咱们展开说说。

(更多博文,欢迎来我的博客学习交流have_a_cat_PHP,C/C++,大厂热门笔试面试-CSDN博客)

一、小球游戏

【题目描述】

某台有10个小球的游戏机,其设定的规则如下:

每一轮游戏在开始之前会把编号为0到9的小球依次放入从左到右编号也为0到9的10个位置;游戏开始后会快速对调任意两个球的位置若干次,并在结束时要求观众写出从左到右的小球编号顺序,写对就得奖。

由于速度很快,所以直接靠观看写对很难。但有个程序员发现这台游戏机其实有一个固定的长度为n的操作序列数据库,每一轮游戏都是随机取一个起始操作序列编号和一个结束操作序列编号(操作序列编号从1到n)并从起始到结束依次执行每个操作序列编号对应的操作,而每个操作序列编号对应的操作就是对该次操作指定的两个编号的位置上的小球进行对调。

现在给出操作序列数据库和每一轮游戏的起始操作序列编号和结束操作序列编号,求每轮游戏结束时从左到右的小球编号顺序。

【解题思路】

这个题目有点长,需要耐心读一下,边读边快速提取关键信息,来我们一起读一遍。

①“把编号为0到9的小球依次放入从左到右编号也为0到9的10个位置”-->设置数组h[10],且令h[i]=i,就是h[位置]=小球编号

②“结束时要求观众写出从左到右的小球编号顺序”-->输出h[0]至h[9]

③“固定的长度为n的操作序列数据库”-->设置数组f[n][2],f[][0]和f[][1]记录对调的位置

(更多博文,欢迎来我的博客学习交流have_a_cat_PHP,C/C++,大厂热门笔试面试-CSDN博客)

④“现在给出操作序列数据库和每一轮游戏的起始操作序列编号和结束操作序列编号,求每轮游戏结束时从左到右的小球编号顺序”-->这是一道考察模拟的题。

模拟题就话不多说,模拟题目描述的过程后,必然AC

【代码语言】

将题目转换为程序员更容易懂的语言就是

已知且每轮游戏不变,现有数组f[n][2],其中数据来源于读入;

已知,现在有数组h[10],初始化为h[i]=i;给出对f的起始操作序列编号c和结束操作序列编号d。

模拟,按照f[c][]到f[d][]中存储的序列,交换h中的数据,即

for(j=c;j<=d;j++)

{

  交换h[f[j][0]]和h[f[j][1]]中的数字

}

输出,输出h[0]至h[9]

循环,将上述游戏进行m轮

 【C代码】

#include <stdio.h>
int main()
{
    int i,j,k;/*用于for循环的变量*/
    int n;/*操作序列的长度*/ scanf("%d",&n);
    int m;/*游戏轮数*/ scanf("%d", &m);
    int f[102400][2];/*操作序列,这里盲猜出题方最大给102400个序列*/
    for(i=1; i<=n; i++)/*读入序列f*/
    {
        scanf("%d",&j); f[i][0]=j;
        scanf("%d",&j); f[i][1]=j;
    }

    int c;/*起始操作序列编号*/
    int d;/*结束操作序列编号*/
    int h[10];//位置
    for(i=0;i<m;i++)/* 进行m轮游戏 */
    {
        for(j=0; j<=9; j++)
        {
            h[j] = j;/*初始化,把编号为0到9的小球依次放入从左到右编号也为0到9的10个位置*/
        }
        scanf("%d",&c);/*读入本轮游戏起始操作序列编号*/
        scanf("%d",&d);/*读入本轮游戏结束操作序列编号*/ 
        for(j=c;j<=d;j++)/*交换h[f[][0]]和h[f[][1]]中的数字*/
        {
            k=h[f[j][0]];
            h[f[j][0]]=h[f[j][1]];
            h[f[j][1]]=k;
        }
        for(j=0; j<=9; j++)/*输出*/
        {
            if(j>0)printf(" ");
            printf("%d",h[j]);
        }printf("\n");
    }
}

【有话想对主办方说】

建议以后的判题程序,可以自动过滤答案末尾的多余空格。

在此题中,我的①输出答案格式,在[自测调试]中可以通过,在[提交]中0%;我的②输出答案格式,在[自测调试]中可以通过,在[提交]中100%;

①输出答案格式

②输出答案格式

        for(j=0; j<=9; j++)/*输出*/

        {

            printf("%d ",h[j]);

        }printf("\n");

        for(j=0; j<=9; j++)/*输出*/

        {

            if(j>0)printf(" ");

            printf("%d",h[j]);

        }printf("\n");

(更多博文,欢迎来我的博客学习交流have_a_cat_PHP,C/C++,大厂热门笔试面试-CSDN博客)

二、王子闯闸门

【题目描述】

波斯王子要去救被贾法尔囚禁的公主,但贾法尔用黑魔法在他面前设置了编号从1到n的n道闸门。从王子的位置到1号闸门需要1秒,从n号闸门到公主所在的位置也需要1秒,从p号闸门到p+1或p-1号闸门都需要1秒。每过1秒钟,王子都必须决定选择前进一道闸门、后退一道闸门或停在原地这三种动作中的一种。当然,王子不能选择移动到关闭状态的闸门而只能选择开启状态的闸门。在王子做出动作选择后,闸门也可能会有关闭和开启的动作,如果王子做完动作后,其所在的闸门在该秒内的动作是从开启变为关闭则他就会被闸门夹死。

现在给出闸门数量n和m个闸门的动作时刻表,求波斯王子需要多少秒才能救出公主。

【解题思路】

这个题目像一个童话故事,哥们,别陷在爱情里,来我们一起边读边快速提取关键信息。

①“从p号闸门到p+1或p-1号闸门都需要1秒”-->相邻闸门间耗时1秒

②“王子都必须决定选择前进一道闸门、后退一道闸门或停在原地这三种动作中的一种”-->策略操作可-1后退/0原地/+1前进

③“王子不能选择移动到关闭状态的闸门而只能选择开启状态的闸门”、“闸门也可能会有关闭和开启的动作”、“m个闸门的动作时刻表”-->闸门有些时间不能通过

(更多博文,欢迎来我的博客学习交流have_a_cat_PHP,C/C++,大厂热门笔试面试-CSDN博客)

④“从王子的位置到1号闸门需要1秒,从n号闸门到公主所在的位置也需要1秒”-->王子位置为0,公主位置为n+1(这里反复读了3遍后,神来之思,从此,这个故事就可以没有公主和王子了,哈哈哈,简化)

看似繁杂,其实,这就是一道 最长不下降子序列 的变型$_$

【代码语言】

已知,有数组f[n],0表示王子的站位,1表示1号闸门的位置,2表示2号闸门的位置… …n表示n号闸门的位置,n+1表示公主的站位f[i]表示到达这个位置时最少花费的时间,初始化f[0]=0;

已知,有数组y[m][3],用于存放闸门的动作时刻表,第y[][0]号闸门在时间y[][1]到y[][27之间关闭;

已知,有数组x[n][2],用于标明闸门有没有、有几段时间会关闭,x[i][0]和x[i][1]初始化为-1,x[i][0]大于等于0表示闸门i有时间会关闭,具体闸门的动作时刻表为y[x[i][0]][]至y[x[i][1]][](这里尤其要注意,闸门会有超过1段时间关闭,比如闸门2会在第2-3秒关闭,且会在第5-6秒关闭,且会在9-10秒关闭,当时解题时,第一次提交没考虑到,如果按一个闸门只有1段时间关闭的话,就是通过率50%)

最长不下降子序列 的变型,用p表示当前的位置,p初始化为0;

whiel(p < (n+1))/*在没有到达n+1位置时,执行*/

{

if(f[p] <= f[p-1]) f[p] =f[p-1]+1;/*到达当前位置p用时=到达位置p-1用时+1秒*/

if(在这1秒到达p位置,正好赶上p位置关闭)

{

f[p]=最近p位置关闭结束的时间+1秒;

(更多博文,欢迎来我的博客学习交流have_a_cat_PHP,C/C++,大厂热门笔试面试-CSDN博客)

f[p-1]= 最近p位置关闭结束的时间;

p--;//相当于在这段时间里,执行了后退+原地策略

}

}

输出,f[p+1]

【C代码】(考试当场写的代码自觉不够优美,思考一夜后,写了个新版,展示如下)

#include<stdio.h>
int main()
{
    int i,j,k;/*循环变量备用*/
    int n;/*闸门数量*/ scanf("%d",&n);
    #define N_MAX 102400;/*盲猜n最大为102400,即最多有102400-2个闸门*/
    int f[N_MAX];/*到达i时花费的最少时间f[i]*/
    for(i = 0; i < N_MAX; i++)/*初始化*/
    {
        f[i]=0;
        x[0]=-1;
        x[1]=-1
    }

    int m;/*闸门关闭的时间组数*/ scanf("%d",&m);
    #define M_MAX 102400;/*盲猜m最大为102400,即最多有102400个闸门的动作时刻表*/
    int y[M_MAX][3];/*闸门的动作时刻表,其中第i条,y[i][0]表示关闭时间,y[i][1]表示再次开启的时间*/
    int a,b,c;/*用于读入数据的变量,第a号闸门在时间b到c之间关闭*/
    for(i = 0; i < m; i++)
    {
        scanf("%d",&a); scanf("%d",&b); scanf("%d",&c);
        y[i][0]=a; y[i][1]=b; y[i][2]=c;
    }

    /*对动作时刻表按照闸门号码排序-这里用插入排序*/
    for(i = 0; i < m; i++)
    {
        for(j = 0; j < m; j++)
        {
            if(y[i][0] < y[j][0])
            {
                int u0,u1,u2;
                u0=y[i][0]; u1=y[i][1]; u2=y[i][2];
                for(k=i;k>j;k--)
                {
                    y[k][0]=y[k-1][0]; y[k][1]=y[k-1][1]; y[k][2]=y[k-1][2];
                }
                y[j][0]=u0; y[j][1]=u1; y[j][2]=u2;
                break;
            }
        }
    }

    int x[N_MAX][2];/*闸门i有好多条时刻表,从x[i][0]到x[i][1]都是闸门i的时刻表*/
    for(i = 0; i < m; i++)
    {
        if(x[y[i][0]][0] < 0)
        {
            x[y[i][0]][0]=i;
        }
        x[y[i][0]][1]=i;
    }

    int p; p=1; /*当前位置,0为王子,n+1为公主*/
    f[0]=0;
    while(p <= (n+1))
    {
        if(f[p] <= f[p-1]) f[p]=f[p-1]+1;
        if(x[p][0] >= 0)/*该闸门有关闭时刻表*/
        {
            int q=-1;/*如果当前闸门关闭,则置为1,否则p++*/
            for(i=x[p][0];i<=x[p][1];i++)/*遍历该闸门的每条时刻表*/
            {
                if((y[i][1]<=f[p])&&(f[p]<=y[i][2]))/*当前时间闸门关闭*/
                {
                    f[p] = y[i][2]+1;
                    f[p-1]=y[i][2];
                    p--;/*当前闸门关闭,后退!*/
                    q=-q;
                    break;
                }
            }
            if(q<0) p++;/* 当前闸门开启,前进!*/
        }
        else
        {
            p++;/* 当前闸门开启,前进!*/
        }
    }
    printf("%d",f[n+1]);
}

【有话想对主办方说】

虽然比赛结束了,但还是想测一测我这个新思考出来的代码版本,有没有可以测试的入口呢?或者是,以后会不会开放往期编程赛题的练习入口

三、附上考试结束时获得的得分报告

每一次坐在电脑前,指尖飞快的流出代码,都是身心最愉悦的时间。 ----2023年8月2日

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

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

相关文章

07_Vue生命周期

Vue3生命周期 配置项的方式写Vue3生命周期 组合式API的方式写生命周期&#xff1a;写在setup里 如果同时用两种方式写生命周期钩子函数&#xff0c;组合式API里边的生命周期要比用配置项写的快一点。 注意&#xff1a;一般用一种方式即可。

人工智能生成内容扑面来袭 低质量内容充斥网络?

自从去年年底ChatGPT火爆上市以来&#xff0c;大批AI生成内容扑面来袭&#xff0c;文本、图片甚至视频都可以在数秒之内由人工智能模型自动生成。AI虽然智能&#xff0c;但它创造的内容也会有错误&#xff0c;而且这些错误很难被发现&#xff0c;它生成的误导信息非常“狡猾”&…

公文内容,可以采用图表、图示等辅助工具来展示信息

在处理复杂的公文内容时&#xff0c;可以采用图表、图示等辅助工具来展示信息&#xff0c;以增强表达效果&#xff0c;提高公文的可读性和理解性。 具体来说&#xff0c;可以采用以下几种方式来展示信息&#xff1a; 1.图表&#xff1a;使用图表可以将复杂的数据和信息以图表形…

Java并发系列之五:ReentranLock

首先尝试用一句话对ReeentrantLock进行概括&#xff1a; ReentrantLock基于AQS&#xff0c;它实现了公平锁和非公平锁&#xff0c;在开发中可以用它对共享资源进行同步。此外&#xff0c;和synchronized一样&#xff0c;ReentrantLock支持可重入&#xff0c;但ReentrantLock在调…

通话降噪算法在手机和IOT设备上的应用和挑战

随着电子产品的升级换代&#xff0c;用户对通话质量的要求也越来越高。通话降噪算法对通话质量起到了关键核心的作用。计算资源的提升使得深度学习模型在便携式的低功耗芯片上面跑起来了&#xff0c;器件成本降低让IoT设备开始使用骨导传感器&#xff0c;&#xff0c;那怎么样才…

提升制造业智能化水平——免费MES系统的领航者

随着工业4.0的持续推进和数字化转型的浪潮涌现&#xff0c;制造业正面临着前所未有的机遇与挑战。在这个数字化时代&#xff0c;企业需要更高效、智能、灵活地管理生产流程&#xff0c;以应对日益激烈的市场竞争。而制造执行系统&#xff08;MES&#xff09;无疑成为了实现这一…

抽象类的顶级理解

目录 1.抽象类的介绍 2. 抽象类语法 3.模板设计模式 1.抽象类的介绍 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果 一个类中没有包含足够的信息来描绘一个具体的对象&…

【Vue3项目实战】vue3项目基于el-menu封装左侧菜单栏组件

文章目录 概述一、先看效果1.1 静态效果1.2 动态效果 二、核心思路三、全量代码3.1 文件目录结构3.2 /sidebar/index.vue 中3.3 /sidebar/sidebarItem.vue 中3.4 路由表结构 四、代码讲解五、SVG组件六、系列文章友链1、[配置husky、stylelint、commitlint&#xff0c;实现git提…

庄懂的TA笔记(十九)<特效:顶点 平移+缩放+旋转+幽灵夜巡效果)>

庄懂的TA笔记&#xff08;十九&#xff09;&#xff1c;特效&#xff1a;顶点 平移缩放旋转幽灵夜巡效果)&#xff1e; 大纲&#xff1a; 效果展示&#xff1a; 正文&#xff1a; 一、顶点平移&#xff1a; 1、代码实现&#xff1a; 1.1、声明移动范围&#xff0c;移动速度。 _…

‘<>‘ cannot be used with anonymous classes

‘&#xff1c;&#xff1e;‘ cannot be used with anonymous classes <>不能与匿名类一起使用 Description Resource Path Location Type <> cannot be used with anonymous classes SearchHitSupport.java /spring-data-elasticsearch/src/main/java/org/spri…

QWidget样式

1、设置边框样式&#xff1a; QWidget {font-family:Microsoft YaHei UI;background:#ffffff;/*border:3px solid rgba(207, 209, 208, 170);设置整体边框*/border-bottom: 3px solid rgba(207, 209, 208, 170);/*设置底部边框*/border-top: 3px solid rgba(207, 209, 208, 1…

谷歌云 | 电子商务 | 如何更好地管理客户身份以支持最佳的用户体验

【本文由Cloud Ace整理发布。Cloud Ace是谷歌云全球战略合作伙伴&#xff0c;拥有 300 多名工程师&#xff0c;也是谷歌最高级别合作伙伴&#xff0c;多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商&#xff0c;我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训…

docker创建镜像并上传云端服务器

docker创建镜像并上传云端服务器 docker容器与镜像的关系1.基本镜像相关文件创建1.1 创建dockerfile文件1.2.创建do.sh文件1.3 创建upload_server_api.py文件1.4 创建upload_server_webui.py文件1.5 文件保存位置 2. 创建镜像操作2.1 创建镜像2.3 创建容器2.2 进入环境容器2.3 …

leetcode----JavaScript 详情题解(4)

目录 2722. 根据 ID 合并两个数组 2723. 添加两个 Promise 对象 2724. 排序方式 2725. 间隔取消 2726. 使用方法链的计算器 2727. 判断对象是否为空 2624. 蜗牛排序 2694. 事件发射器 2722. 根据 ID 合并两个数组 现给定两个数组 arr1 和 arr2 &#xff0c;返回一个新…

Flink 系列四 Flink 运行时架构

目录 前言 介绍 1、程序结构 1.1、Source 1.2、Transformation 1.3、Sink 1.4、数据流 2、Flink运行时组件 2.1、Dispatcher 2.2、JobManager 2.3、TaskManager 2.4、ResourceManager 3、任务提交流程 3.1、standalone 模式 3.2、yarn 模式 4、任务调度原理 4…

AI智慧安监视频监控汇聚平台EasyCVR调用接口出现跨域现象该如何解决?

视频监控汇聚EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视…

Scrum敏捷开发流程图怎么画?

1. 什么是Scrum敏捷开发流程图&#xff1f; Scrum敏捷开发流程图是一种可视化工具&#xff0c;用于形象地描述Scrum敏捷开发方法中的工作流程和活动。Scrum敏捷开发流程图展示了项目从需求收集到产品交付的整个开发过程&#xff0c;帮助团队理解和跟踪项目进展&#xff0c;促…

vue使用FullCalendar插件实现日历会议预约功能

目录 1. vue 项目使用npm安装插件 2. vue 页面代码&#xff08;直接复制粘贴可用&#xff09; 3. vue FullCalendar的内置函数以及配置 前言&#xff1a;此案例是用FullCalendar插件做一个会议日程预约功能&#xff0c;此功能可查看自己的日程安排会议信息等...... FullC…

国产化车载智能座舱方案引领新时代

车载智能座舱是一项集成了多种技术的复杂工程&#xff0c;包括大量的硬件设备、大数据分析、实时交互、用户体验和技术创新研发等。由于涉及的技术领域繁多&#xff0c;智能座舱技术在实际应用中面临很多技术壁垒&#xff0c;如硬件性能、互联互通、集成性、数据采集、存储、处…

Flink正常消费一段时间后,大量反压,看着像卡住了,但又没有报错。

文章目录 前言一、原因分析二、解决方案 前言 前面我也有提到&#xff0c;发现flink运行一段时间后&#xff0c;不再继续消费的问题。这个问题困扰了我非常久&#xff0c;一开始也很迷茫。又因为比较忙&#xff0c;所以一直没有时间能够去寻找答案&#xff0c;只是通过每天重启…