CSDN竞赛68期题解

news2024/11/19 10:29:46

总结

近几期的题目质量有所提升,数据范围还是一如既往的没给。对于算法题,给定详细的数据范围,规范输入输出,再多给出几个样例以及样例说明,参赛的体验感才会提升。

题目列表

1.小球游戏

题目描述

某台有10个小球的游戏机,其设定的规则如下: 每一轮游戏在开始之前会把编号为0到9的小球依次放入从左到右编号也为0到9的10个位置;游戏开始后会快速对调任意 两个球的位置若干次,并在结束时要求观众写出从左到右的小球编号顺序,写对就得奖。 由于速度很快,所以直接靠观看写对很难。但有个程序员发现这台游戏机其实有一个固定的长度为n的操作序列数据库, 每一轮游戏都是随机取一个起始操作序列编号和一个结束操作序列编号(操作序列编号从1到n)并从起始到结束依次执行 每个操作序列编号对应的操作,而每个操作序列编号对应的操作就是对该次操作指定的两个编号的位置上的小球进行对 调。 现在给出操作序列数据库和每一轮游戏的起始操作序列编号和结束操作序列编号,求每轮游戏结束时从左到右的小球编号 顺序。

分析

前几期才考过的题目,但是貌似没有写过题解。题目比较长但是意思还是很简单的,按照题意直接模拟游戏操作,每轮游戏根据操作序列对原始序列对应位置上的小球进行交换即可。

代码

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 100005;
pair<int,int> q[N];
int main() {
	int n,m;
	cin>>n>>m;
	for(int i = 1; i <= n; i++) cin>>q[i].first>>q[i].second;
	int c,d;
	vector<int> p(10, 0);
	for(int i = 0; i < 10; i++) p[i] = i;
	while(m--) {
		vector<int> t = p;
		cin>>c>>d;
		for(int i = c; i <= d; i++) {
			swap(t[q[i].first], t[q[i].second]);
		}
		for (int i = 0; i < 10; i++) cout<<t[i]<<" \n"[i==9];
	}
	return 0;
}

2.王子闯闸门

题目描述

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

分析

题目不错,唯一的诟病是不给数据范围,对于这种与数据范围强相关的题目,没有数据范围去求解,只能不断的尝试了。

状态由时间和位置两个维度组成,可以用下面的图来表示。

在这里插入图片描述

( t , x ) (t,x) (t,x)表示第 t t t秒在 x x x位置的状态,如图所示, ( 1 , 1 ) (1,1) (1,1)可以转移到 ( 2 , 0 ) (2,0) (2,0) ( 2 , 1 ) (2,1) (2,1) ( 2 , 2 ) (2,2) (2,2)三种状态。也可以说, ( t , x ) (t,x) (t,x)可以由 ( t − 1 , x − 1 ) (t-1,x-1) (t1,x1) ( t − 1 , x ) (t-1,x) (t1,x) ( t − 1 , x + 1 ) (t-1,x+1) (t1,x+1)三种状态转移而来。

状态表示: f [ i ] [ j ] f[i][j] f[i][j]表示第 i i i秒在 j j j位置上的合法性,值为 t r u e true true表示合法, f a l s e false false表示不合法。

状态转移方程:
f [ i ] [ j ] = { f a l s e , 第i秒时j号闸门是关闭的 f [ i − 1 ] [ j − 1 ]   ∣   f [ i − 1 ] [ j ]   ∣   f [ i − 1 ] [ j + 1 ] , 第i秒时j号闸门是开启的 f[i][j]= \begin{cases} false, & \text{第i秒时j号闸门是关闭的}\\ \\ f[i-1][j-1]\ |\ f[i-1][j]\ |\ f[i-1][j+1],& \text{第i秒时j号闸门是开启的} \end{cases} f[i][j]= false,f[i1][j1]  f[i1][j]  f[i1][j+1],i秒时j号闸门是关闭的i秒时j号闸门是开启的
可以发现,每层状态仅与上一层的状态有关,所以可以使用滚动数组表示,即只保存两层的状态,这样可以节省空间。

使用DP求解本题的代码如下:

f[0][0] = f[1][0] = true;
for (int i = 1; i < N;i++) {
    int t1 = i & 1, t2 = 1 - t1;
    for(int j = 1; j <= n;j++){
        if (!check(j, i)) {
            f[t1][j] = false;
            continue;
        }
        f[t1][j] = (f[t2][j] | f[t2][j+1] | f[t2][j-1]);
    }
    if (f[t1][n]) {
        cout<<i + 1<<endl;
        return 0;
    }
}

其中状态边界就是王子的位置0,任何时间段都是合法的。考试时没有使用DP求解,上面代码可以通过简单的测例,由于不知道数据范围,所以不保证可以AC。

考试时使用了BFS进行求解,仅通过了四成用例,加上各种剪枝以及记忆化搜索后还是没有通过更多的用例,最后心累了,毁灭吧,直接交了。

首先要考虑的是如何判断某一时刻的某个位置的闸门是不是关闭的,由于时间以及位置不知道范围,直接使用map显然会TLE。这里将每个闸门的关闭时间区间放到vector里,进行排序后备用。每次需要查询该闸门在 t i ti ti时刻是不是开启的,只需要对这个由区间构成的向量进行二分查找即可,查找效率还是可观的。

由于BFS过程比较简单,不再赘述。使用过的优化操作如下:

  • 优化搜索顺序,最先将+1的位置入队。
  • 剪枝:当+1位置后续时刻闸门不会关闭时,果断将+1位置入队,且不再考虑原地和后退的选择。
  • 记忆化搜索:当某个状态 ( t , x ) (t,x) (t,x)之前入过队的时候,不再重复入队。

说下几个优化操作的效果,优化搜索顺序在DFS中效果显著,BFS里收效甚微。看了下问哥的思路是使用DFS求解,不能说这个操作没用,只是用错了地方,要是用了深搜大概可以多通过几个测例的。

剪枝操作也很重要,当时猜想有大片连续的不会关闭的闸门,所以这种情况下一直向前走,奈何BFS的性质效果也没那么好。至于记忆化搜索,由于二元组状态比较多,使用了记忆化搜索效率反而更低了,这也是开始判断某一时刻闸门是否关闭时没用使用map的原因,代码里也就删掉了记忆化搜索的语句。

BFS求解的代码如下,由于没有评测系统,就没再继续写DFS的解法了。

代码

#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
const int N = 100005;
typedef pair<int,int> PII;
int n,m;
vector<PII> t[N];
queue<PII> q;
bool check(int p, int ti) {
	auto &v = t[p];
	int l = 0, r = v.size() - 1;
	if (r < 0) return true;
	while(l < r) {
		int mid = (l + r) >> 1;
		if(ti < v[mid].first) r = mid - 1;
		else if(ti > v[mid].second) l = mid + 1;
		else return false;
	}
	if (ti >= v[l].first && ti <= v[l].second) return false;
	return true;
}
int main() {
	cin>>n>>m;
	int a,b,c;
	for(int i = 0; i < m; i++) {
		cin>>a>>b>>c;
		t[a].push_back({b, c});
	}
	for(int i = 0; i < N; i++) {
		if (t[i].size()) sort(t[i].begin(), t[i].end());
	}
	q.push({0, 0});
	int cnt = 0;
	while(q.size()) {
		cnt++;
		PII u = q.front();
		q.pop();
		int p = u.first, ti = u.second + 1;
		if (cnt > 1e6) {//绕过TLE
			cout<<t[n].back().second + 2<<endl;
			break;
		}
		if (p == n) {//到达n号闸门
			cout<<ti<<endl;
			return 0;
		}
		for(int i = 1; i >= -1; i--) {
			if (t[p + i].empty() || t[p + i].back().second < ti) {
				q.push({p+i,ti});
				break;//剪枝
			}
			if (check(p + i, ti)) {
				q.push({p+i, ti});
			}
		}
	}
	return 0;
}

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

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

相关文章

[Python] Pylance 插件打开 Python 的类型检查

安装 Python 插件 2.打开一个 Python 文件 可以看到右下角有一个花括号和 Python 字样&#xff0c;点击花括号&#xff08;不是 Python 字样&#xff09;打开类型检查即可&#xff1a;

【问题随记】

ubuntu 14.04源更新(sources.list) deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ trusty-update…

echart图表X轴文字太长被隐藏标签解决方案

在Echart图标中&#xff0c;X轴的标签文字间隔默认是自动计算的&#xff0c;在标签文字长度太长的情况下&#xff0c;有可能标签会被隐藏掉&#xff0c;如图 这种显示显然是不符合严谨的业务需求。以下提供三种解决方案 第一种&#xff1a;竖排显示 效果&#xff1a; 在高度一…

汽车EBSE测试流程分析(四):反思证据及当前问题解决

EBSE专题连载共分为“五个”篇章。此文为该连载系列的“第四”篇章&#xff0c;在之前的“篇章&#xff08;三&#xff09;”中已经结合具体研究实践阐述了“步骤二&#xff0c;通过系统调研确定改进方案”等内容。那么&#xff0c;在本篇章&#xff08;四&#xff09;中&#…

web爬虫第五弹 - JS逆向入门(猿人学第一题)

0- 前言 爬虫是一门需要实战的学问。 而对于初学者来说&#xff0c;要想学好反爬&#xff0c;js逆向则是敲门砖。今天给大家带来一个js逆向入门实例&#xff0c;接下来我们一步一步来感受下入门的逆向是什么样的。该案例选自猿人学练习题。猿人学第一题 1- 拿到需求 进入页面…

据说这是最全的,App自动化测试思路总结,从0到1实施...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、编程语言选择 …

Open3d——根据距离参数给点云上渐变色

找了半天网上都没有开源的根据距离进行点云渐变色上色的代码&#xff0c;所以写一个方便自己和大家的使用~ 渐变色生成代码 输入点云shape为[N,3]&#xff0c;我这里使用的是nuScenes数据集&#xff0c;生成的点云使用到中心点的距离作为参数&#xff0c;进行渐变&#xff0c;…

XML(eXtensible Markup Language)

目录 为什么需要XML? 一 XML语法 1.文档声明 2.元素 语法: 3.属性 4.注释 5.CDATA节 二 树结构 三 转义字符 四 DOM4J 1.XML解析技术 2.dom4j介绍 3.dom4j基本使用 XML 指可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;。 XML 被设计用来传…

SQL-每日一题【1179. 重新格式化部门表】

题目 部门表 Department&#xff1a; 编写一个 SQL 查询来重新格式化表&#xff0c;使得新的表中有一个部门 id 列和一些对应 每个月 的收入&#xff08;revenue&#xff09;列。 查询结果格式如下面的示例所示&#xff1a; 解题思路 1.题目要求我们重新格式化表&#xff0c;…

leetcode 1480.一维数组的动态和

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;一维数组的动态和 ps&#xff1a; 动态数组求和其实就是当前 i 位置的值等于 0 - i 的求和&#xff0c;控制好循环条件即可。 代码&#xff1a; /*** Note: The returned array must be malloced, assume caller calls…

4000字,详解数据管理之简介篇

DAMA-DMBOK 2.0既 DAMA 数据管理知识体系指南共分为17章&#xff0c;是从事数据治理人员的参考宝典。也CDMP及CDGA、CDGP认证的考试用书。 我在这里将17个章节根据个人理解分为数据管理简介、数据管理框架、数据处理伦理、数据管理组件、数据管理组织、大数据与数据科学和数据…

阿里云容器服务助力极氪荣获 FinOps 先锋实践者

作者&#xff1a;海迩 可信云评估是中国信息通信研究院下属的云计算服务和软件的专业评估体系&#xff0c;自 2013 年起历经十年发展&#xff0c;可信云服务评估体系已日臻成熟&#xff0c;成为政府支撑、行业规范、用户选型的重要参考。 2022 年 5 月国务院国资委制定印发《…

FTP可能是免费且易于使用,但这就是问题所在

当团队里的某个人发现他们需要马上发送的文件太大&#xff0c;无法通过电子邮件发送时&#xff0c;就会陷入困境。另一个同事开始用电子邮件发送账号或密码&#xff0c;然后意识到&#xff0c;也许电子邮件不够安全&#xff0c;FTP替代&#xff0c;托管文件传输。 FTP可能是免费…

线扫激光算法原理

一:线扫激光算法原理 激光器发出的激光束经准直聚焦后垂直入射到物体表面上,表面的散射光由接收透镜成像于探测器的阵列上。光敏面于接收透镜的光轴垂直。如图: 当被测物体表面移动x,反应到光敏面上像点位移为x’。a为接收透镜到物体的距离(物距),b为接收后主面到成像…

HCIE-Security 安全策略技术——流量处理

一、防火墙安全策略原理及配置 1.包过滤技术 对需要转发的数据包&#xff0c;先获取包头信息&#xff0c;然后和设定的规则进行比较&#xff0c;根据比较结果对数据包进行转发和丢弃 2.包过滤技术进阶——安全策略 包过滤&#xff1a;五元组&#xff0c;ACL 安全策略&#…

主动带宽控制工具

停机和带宽过度使用是任何组织都无法避免的两个问题。随着企业采用 BYOD 文化&#xff0c;通过网络的流量负载可能很重&#xff0c;导致网络拥塞并使网络容易受到网络攻击。为了解决这个问题&#xff0c;企业需要全面的监控策略来保护网络&#xff0c;当看似大量的流量进入网络…

通过MySQL删除Hive元数据信息

之前遇到过一个问题&#xff0c;在进行Hive的元数据采集时&#xff0c;因为Hive表的文件已经被删除了&#xff0c;当时是无法删除表&#xff0c;导致元数据采集也发生了问题&#xff0c;所以希望通过删除Hive表的元数据解决上述问题。 之前安装时&#xff0c;经过特定的配置后…

Qt应用开发(基础篇)——数值微调输入框QAbstractSpinBox、QSpinBox、QDoubleSpinBox

目录 一、前言 二、QAbstractSpinBox类 1、accelerated 2、acceptableInput 3、alignment 4、buttonSymbols 5、correctionMode 6、frame 7、keyboardTracking 8、readOnly 9、showGroupSeparator 10、specialValueText 11、text 12、wrapping 13、信号 二、Q…

zabbix监控mysql容器主从同步状态并告警钉钉/企业微信

前言&#xff1a;被监控的主机已经安装和配置mysql主从同步&#xff0c;和zabbix-agent插件。 mysql创建主从同步&#xff1a;http://t.csdn.cn/P4MYq centos安装zabbix-agent2&#xff1a;http://t.csdn.cn/fx74i mysql主从同步&#xff0c;主要监控这2个参数指标&#xf…

java -jar指定外部配置文件

场景 spingboot项目部署jar时,需要时常修改配置,为了方便,将配置文件放到jar包外 操作步骤 在jar包同级目录下创建config文件夹(位置没有强制要求,为了方便而已) 在jar包同级目录下创建start.bat文件,并编辑内容 echo off :: 命令窗口标题 title yudibei_performance_tes…