【题解】2023 DTS算法竞赛集训 第1次

news2024/11/16 0:28:28

比赛地址:https://www.luogu.com.cn/contest/143650

P1319 压缩技术

https://www.luogu.com.cn/problem/P1319
简单的签到模拟题

#include <iostream>//c++标准库
using namespace std;
int main(){
	int a,n,t=0,i=0,b,s=0;//t判断有没有回车,i判断输出什么,s判断有没有输完
	cin>>n;
	while(s<n*n){
		cin>>a;//循环输入a;
		i++;
		for(b=a;b>=1;b--){
			if(t==n){cout<<endl;t=0;}//判断是否需要回车,回车后t要清零
			if(i%2==1)cout<<0;
            else cout<<1;//判断是否i不被2整除,输出0,否则输出1,注意不要回车
			t++;
			s++;//t与s加一
			}
		}
	cout<<endl;
	return 0;
}

P8598 [蓝桥杯 2013 省 AB] 错误票据

https://www.luogu.com.cn/problem/P8598
这道题是判断输入的数字是否连续和重复的,那肯定是要让数字从小到大排序才能找到中断和重复数字。那排序复杂度最少是O(nlgn),是否有更快的方法?

因为输入的数字不是按照大小排序的,非常自然的想到哈希表去处理。用哈希表h记录出现的数字的次数,最后去遍历,如果出现了0次,说明中断了,如果出现了1次以上,说明重复了。

题目中给的数据范围是:正整数(不大于 1 0 5 10^5 105),因此哈希表的大小是1e5 + 5

另外要注意,如果从头遍历哈希表,前面可能有许多0,要判断更多的情况,因此可以记录下输入的最大值amax和最小值amin,在这个边界[amin,amax]里去找0和大于1的值对应的下标。

#include<bits/stdc++.h>
using namespace std;

const int K = 1e5 + 5;
int h[K];
int main() {
    int N;
    cin >> N;
    
    int amin = 1e5;
    int amax = 0;
    int m, n; 
    int x;
    while (N--) {
        while (cin >> x) {
            if (++h[x] > 1) n = x;
            amin = min(amin, x);
            amax = max(amax, x);
        }
    }
    
    for (int i = amin; i <= amax; i++) {
        if (h[i] == 0) m = i;
    }
    cout << m << " " << n;
    return 0;
}

P1115 最大子段和

https://www.luogu.com.cn/problem/P1115
一道经典的考研及面试题,有许多解法

要求找出连续字串的最大和,那就需要确定左右区间[l,r],再计算这个区间和。

1.暴力

我们要枚举所有情况,也就是枚举出所有的区间情况,那么l取值是[0,len(s))r取值是[i,len(s)),两层for循环。确定区间后,还要遍历区间所有数字计算和,那么整体的复杂度就是O(n^3)。这个复杂度非常高。

2.前缀和

上面的暴力求解中,第三步计算区间和,我们理所当然的对应前缀和的知识点,可以用前缀和通过O(1)的时间去计算区间所有数字计算和。

#include<bits/stdc++.h>
using namespace std;

int maxSubarraySum(vector<int>& nums) {
    int n = nums.size();
    vector<int> prefixSum(n + 1, 0); // 前缀和数组,prefixSum[i]表示前i个元素的和
    for (int i = 1; i <= n; i++) {
        prefixSum[i] = prefixSum[i - 1] + nums[i - 1];
    }

    int maxSum = INT_MIN; // 最大和
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j <= n; j++) {
            int sum = prefixSum[j] - prefixSum[i]; // 计算从第i个元素到第j个元素的和
            maxSum = max(maxSum, sum);
        }
    }

    return maxSum;
}

int main() {
    int n;
    cin >> n;

    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }

    int maxSum = maxSubarraySum(nums);
    cout << maxSum;

    return 0;
}

但是用前缀和虽然把时间复杂度降到了O(n^2),但是依旧有的测试点过不了,我们还需要复杂度更低的代码。

在这里插入图片描述

3.贪心

考虑更低的复杂度,我们思考如何用O(n)的时间解决,也就是遍历一遍这个数组。

采用贪心的思想,记录最大和maxSum(当前为止最大的子串和)和当前和currentSum(当前为止选择的连续子串和)

遍历每个数时更新这两个变量。maxSum=max(maxSum,currentSum)这个没什么好说的。在更新currentSum时,如果 c u r r e n t S u m < 0 currentSum<0 currentSum<0,就说明从之前的起点 l l l到当前下标 i i i这段 [ l , i ] [l,i] [l,i]的和 s u m [ l , i ] < 0 sum_{[l,i]}<0 sum[l,i]<0。往后再加后面的数字 a [ i + 1 ] a[i+1] a[i+1]时,如果 l l l不变,有 s u m [ l , i ] + a [ i + 1 ] < a [ i + 1 ] sum_{[l,i]}+a[i+1]<a[i+1] sum[l,i]+a[i+1]<a[i+1],那我们肯定是要舍弃 [ l , i ] [l,i] [l,i]这一段的,从 i + 1 i+1 i+1开始重新计算,也就是令 l = i + 1 , c u r r e n t S u m = 0 l=i+1, currentSum=0 l=i+1,currentSum=0

#include<bits/stdc++.h>
using namespace std;

int maxSubarraySum(vector<int>& nums) {
    int n = nums.size();
    int maxSum = INT_MIN; // 最大和
    int currentSum = 0; // 当前和

    for (int i = 0; i < n; i++) {
        currentSum += nums[i];

        if (currentSum > maxSum) {
            maxSum = currentSum;
        }

        if (currentSum < 0) {
            currentSum = 0;
        }
    }

    return maxSum;
}

int main() {
    int n;
    cin >> n;

    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }

    int maxSum = maxSubarraySum(nums);
    cout << maxSum;

    return 0;
}

降低复杂度之后可以通过全部的样例点。

在这里插入图片描述

4.动态规划

另一种思路是动态规划。

可以令 d p [ i ] dp[i] dp[i]表示:以 i i i结尾的连续子串最大和。

那么考虑所有的情况,结果应该是: r e s = m a x 1 ≤ i ≤ n d p [ i ] res=max_{1\leq i \leq n} dp[i] res=max1indp[i]

重点是状态转移方程。遍历到 i i i时,因为要求区间连续,只有两种情况:用 [ l , i − 1 ] [l,i-1] [l,i1]和不用 [ l , i − 1 ] [l,i-1] [l,i1]。如果用的话,那新的区间是 [ l , i ] [l,i] [l,i];如果不用,那新的区间是 [ i , i ] [i,i] [i,i]。因此有: d p [ i ] = m a x ( d p [ i − 1 ] + a [ i ] , a [ i ] ) dp[i] = max(dp[i-1]+a[i],a[i]) dp[i]=max(dp[i1]+a[i],a[i])

另外由于 d p [ i ] dp[i] dp[i]只跟 d p [ i − 1 ] dp[i-1] dp[i1]有关,dp数组可以用滚动数组优化空间。

时间复杂度是 O ( n ) O(n) O(n),空间复杂度是 O ( 1 ) O(1) O(1),与贪心相同。

#include<bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    int ans = INT_MIN;
    int dp = 0;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        dp = max(x, dp + x);
        ans = max(ans, dp);
    }
    cout << ans;
    return 0;
}

P1002 [NOIP2002 普及组] 过河卒

https://www.luogu.com.cn/problem/P1002
首先这道题如果用搜索,每个节点两种状态,需要用dfs递归很多层。因此看看能不能用动态规划去优化重复子问题。

动态规划,每个位置只能从上面或右面走到,对应两个状态转移:
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j]=dp[i-1][j]+dp[i][j-1] dp[i][j]=dp[i1][j]+dp[i][j1]
另外要注意,马对应上面的位置下标有可能越界,为了方便起见,我们将所有的坐标对应的+2

#include<bits/stdc++.h> 

using namespace std;
long long int dp[40][40], ma[40][40];
int n, m, a, b;
int main() {
	cin >> n >> m >> a >> b;
	n += 2, m += 2, a += 2, b += 2;
	ma[a][b] = 1;
	ma[a - 1][b + 2] = 1;
	ma[a - 1][b - 2] = 1;
	ma[a + 1][b - 2] = 1;
	ma[a + 1][b + 2] = 1;
	ma[a + 2][b - 1] = 1;
	ma[a + 2][b + 1] = 1;
	ma[a - 2][b - 1] = 1;
	ma[a - 2][b + 1] = 1;
	dp[1][2] = 1;
	for (int i = 2; i <= n; i++) {
		for (int j = 2; j <= m; j++) {
			if (ma[i][j] == 1) {
				continue;
			}
			else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
		}
	}
	cout << dp[n][m];
	return 0;
}

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

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

相关文章

分支限界法求解迷宫问题

问题描述 从入口出发&#xff0c;按某一方向向前探索&#xff0c;若能走通(未走过的&#xff09;&#xff0c;即某处可以到达&#xff0c;则到达新点&#xff0c;否则试探下一方向&#xff1b;若该点所有的方向均没有通路&#xff0c;则沿原路返回到前一点&#xff0c;换下一个…

一台抵得上多种测量仪器-B1500A半导体参数分析仪

一台抵得上多种测量仪器-B1500A半导体参数分析仪 B1500A 半导体器件分析仪 卓越的测量能力&#xff0c; 完美的一体化解决方案&#xff0c; 经济高效, 出色的软件。 #B1500A 3步表征设备 使用B1500A半导体参数分析仪或PC上随附的EasyEXPERT group 表征软件。EasyEXPERT …

如何卸载在linux下通过rpm安装的mysql

目录 1.先关闭MySQL服务并查看运行状态 2.使用 rpm 管道命令的方式查看已安装的mysql 3. 使用rpm -ev 命令移除安装 4. 删除MySQL数据库内容 1.先关闭MySQL服务并查看运行状态 如果之前安装过并已经启动&#xff0c;则需要卸载前请先关闭MySQL服务 systemctl stop mysqld…

Juniper Networks Junos OS EX远程命令执行漏洞(CVE-2023-36845)

Juniper Networks Junos OS EX远程命令执行漏洞&#xff08;CVE-2023-36845&#xff09; 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: body"J-web" || title"Juniper Web Device Manager" 漏洞复现1. 构造poc2. 查看文件3. 执行命令 免责声明 仅用于技…

【编译原理】LL(1)文法

文章目录 语法分析基本概念自上而下语法分析自上而下语法分析的问题 消除文法左递归消除直接左递归消除间接左递归消除左递归的算法 解决回溯问题FIRST集与提出公共左因子FIRST集提取左公共因子 FOLLOW集合 构造FIRST集和FOLLOW集构造FIRST集合构造每个文法符号的FIRST集合构造…

新书稿费终于下来了!你猜有多少?

我的新书《从零开始学ARM》从正式出版到现在已经有半年时间了&#xff01; 第一批印刷的几千册已经基本销售完&#xff0c; 第二版会对其中勘误进行修正&#xff0c;并继续继续印刷。 前两年写书、审稿&#xff0c; 所有业余时间都耗在这上面了&#xff0c; 在下面这篇文章…

人大金仓KingbaseES_V008R006C008B0014安装

人大金仓安装 一、安装前准备工作 1、硬件环境要求 KingbaseES支持通用X86_64、龙芯、飞腾、鲲鹏等国产CPU硬件体系架构。 2、软件环境要求 KingbaseES支持各种主流的Linux操作系统64位发行版本&#xff0c;包括CentOS、中标麒麟、银河麒麟、统信UOS、Deepin、凝思、中科方…

基于springboot+vue开发的教师工作量管理系

教师工作量管理系 springboot31 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了教师工作量管理系统的开发全过程。通过分析教师工作量管理系统管理的不足&#xff0c;创建了一个计算机管理教师工作量管理系…

EtherCAT转EtherNET/IP协议网关控制EtherCAT伺服驱动器的方法

只需一步&#xff0c;将你的EtherCAT协议设备转换为EthernetIP协议&#xff01; 捷米特JM-ECTM-EIP网关&#xff0c;这款专为EtherCAT协议设备设计的转接装置&#xff0c;可以轻松地将EtherCAT设备数据采集的数据转换成EthernetIP协议。而且&#xff0c;我们的网关接口非常灵活…

同星智能亮相2023北美汽车测试展,国产替代的前方是“星辰大海”!

01 圆满落幕 2023年10月24日至10月26日&#xff0c;为期三天的2023北美汽车测试展览会&#xff08;Automotive Testing Expo&#xff09;在美国密歇根 Surburban Collection Showplace 成功举行。同星智能作为一家具备全球影响力的中国工业软件企业亮相了本次展会&#xff0c;…

聊一聊 tcp/ip 在.NET故障分析的重要性

一&#xff1a;背景 1. 讲故事 这段时间分析了几个和网络故障有关的.NET程序之后&#xff0c;真的越来越体会到计算机基础课的重要&#xff0c;比如 计算机网络 课&#xff0c;如果没有对 tcpip协议 的深刻理解&#xff0c;解决这些问题真的很难&#xff0c;因为你只能在高层…

linux 安装 Anaconda3

文章目录 一、下载二、安装1.使用xftp把下载包拉到服务器上2.执行安装命令3、在安装时没有自动添加环境变量&#xff0c;这里手动设置3.1.1通过修改~/.bashrc来配置环境变量3.1.2 重新载入配置文件3.1.3 测试 一、下载 官网下载链接 二、安装 1.使用xftp把下载包拉到服务器上…

安装RabbitMQ

安装RabbitMQ 下载需要的两个包 # 这直接就可以安装了&#xff0c;下面 ‘上传对应的rmp包’ 操作 [rootrabbitmq-1 ~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash [rootrabbitmq-1 ~]# yum install erlang-21.3.8.2…

linux继续循环案例测试ping网络,目录下的文件权限循环输出

第一&#xff1a;查看本机ip #ip addr 通过脚本访问本机ip1-100&#xff0c;是否可以ping通&#xff0c;并显示结果&#xff0c;上图 知识点 ping -c 数字1 -w 数字1&#xff0c;向目的ip发送1个数据包&#xff0c;等待1秒&#xff0c;无回复中止 &>/dev/null 知…

python 之生成器表达式,以及与列表推导式的区别

文章目录 生成器表达式基本结构示例生成一个简单的生成器遍历生成器并获取值使用条件过滤 优点 生成器表达式与列表推导式的区别1. 返回类型2. 生成方式3. 内存占用4. 访问方式示例总结 生成器表达式是一种在 Python 中用来创建生成器的高效方法。生成器表达式和列表推导式类似…

The valid characters are defined in RFC 7230 and RFC 3986

服務器通過Body 對象接收參數&#xff0c;而客戶端通過param 地址URL傳參數&#xff0c;不能解析。 return axiosHelper<Protocol<ABC[]>>({method: POST,url: ,data: _reqparams: {data: _req}}) public List<InvoiceItem> getAAAA(RequestBody Query quer…

Ubuntu 22.04.3 LTS中安装singularity

文章目录 概要背景知识什么是singularity ? 安装流程1. 安装Go2. 下载Singularity3. 编译Singularity源代码 4. 验证安装是否成功singularity的使用安装open structure 小结 概要 这里主要记录singularity的安装和使用&#xff0c;安装过程中会出现相关的错误&#xff0c;所以…

redis: 记录一次线上redis内存占用过大问题解决过程

引言 记录一次线上redis占用过大的排查过程&#xff0c;供后续参考 问题背景 测试同事突然反馈测试环境的web系统无法登陆&#xff0c;同时发现其他子系统也存在各类使用问题 排查过程 1、因为首先反馈的是测试环境系统无法登陆&#xff0c;于是首先去查看了登陆功能的报错…

阿里微服务质量保障系列:故障演练

对于很多大型企业(如阿里巴巴)来说,经过多年的技术演进,系统工具和架构已经高度垂直化,服务器规模也达到了比较大的体量。当服务规模大于一定量(如10000台)时,小概率的硬件故障每天都会发生。这时如果需要人的干预,系统就无法可靠的伸缩。 为此每一层的系统都会面向失…

数据库SQL

数据库&SQL 数据库基本概念数据库DataBase定义 数据库管理系统(DBMS)定义在JAVA项目中与数据库的结合数据库管理系统中常见的概念库与表的关系 SQL数据类型数字类型浮点类型字符类型TEXT类型日期类型 SQL语言的分类DDL:数据定义语言修改表结构的注意事项 DML:数据操作语言D…