首页 > 其他分享 >蓝桥杯2023年第十四届省赛A组-更小的数

蓝桥杯2023年第十四届省赛A组-更小的数

时间:2024-08-10 15:52:45浏览次数:11  
标签:子串 下标 int 210102 蓝桥 num 2023 new 省赛

题目描述

蓝桥杯2023年第十四届省赛真题-更小的数

小蓝有一个长度均为 n 且仅由数字字符 0 ∼ 9 组成的字符串,下标从 0 到 n − 1,你可以将其视作是一个具有 n 位的十进制数字 num,小蓝可以从 num 中选出一段连续的子串并将子串进行反转,最多反转一次。小蓝想要将选出的子串进行反转后再放入原位置处得到的新的数字 num_new 满足条件 num_new < num,请你帮他计算下一共有多少种不同的子串选择方案,只要两个子串在 num 中的位置不完全相同我们就视作是不同的方案。

注意,我们允许前导零的存在,即数字的最高位可以是 0 ,这是合法的。

输入格式

输入一行包含一个长度为 n 的字符串表示 num(仅包含数字字符 0 ∼ 9),从左至右下标依次为 0 ∼ n − 1。

输出格式

输出一行包含一个整数表示答案。

样例输入

210102

样例输出

8

提示

一共有 8 种不同的方案:

1)所选择的子串下标为 0 ∼ 1 ,反转后的 num_new = 120102 < 210102 ;

2)所选择的子串下标为 0 ∼ 2 ,反转后的 num_new = 012102 < 210102 ;

3)所选择的子串下标为 0 ∼ 3 ,反转后的 num_new = 101202 < 210102 ;

4)所选择的子串下标为 0 ∼ 4 ,反转后的 num_new = 010122 < 210102 ;

5)所选择的子串下标为 0 ∼ 5 ,反转后的 num_new = 201012 < 210102 ;

6)所选择的子串下标为 1 ∼ 2 ,反转后的 num_new = 201102 < 210102 ;

7)所选择的子串下标为 1 ∼ 4 ,反转后的 num_new = 201012 < 210102 ;

8)所选择的子串下标为 3 ∼ 4 ,反转后的 num_new = 210012 < 210102 ;

对于 20% 的评测用例,1 ≤ n ≤ 100 ;

对于 40% 的评测用例,1 ≤ n ≤ 1000 ;

对于所有评测用例,1 ≤ n ≤ 5000 。

错误解法

暴力遍历字符串,若 s[i] > s[j] 则满足条件,则答案的个数加 1。 若s[i] = s[j],则将子串区间 [i, j] 缩小为 [i + 1, j - 1],再判断 s[i + 1] 和 s[j - 1] 的大小关系。

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	string s;
	cin >> s;
	int ans = 0;
	for(int i = 0; i < s.size() - 1; i++)
	{
		for(int j = i + 1; j < s.size(); j++)
		{
			if(s[i] > s[j])
			{
				ans++;
			}
			else if(s[i] == s[j])
			{
				int u = i, v = j;
				while(u < v)
				{
					u++, v--;
					if(s[u] > s[v])
					{
						ans++;
						break;
					}
					else if(s[u] < s[v])
					{
						break;
					}
				}
			}
		}
	}
	cout << ans << endl;
	return 0;
}

时间复杂度最坏为 O(n^3)(所有数都相同),n 的范围是 5000,显然会超时。

整体思路

考虑区间动态规划,dp[i][j]​ 表示从 i 到 j 反转后是否满足要求,满足要求赋值为 true,否则赋值为 false。

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

const int N = 5e3 + 5;
bool dp[N][N];

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	string s;
	cin >> s;
	int n = s.size();
	for(int i = 0; i < n - 1; i++)
	{
		dp[i][i + 1] = (s[i] > s[i + 1]);
	}
	for(int len = 2; len <= n; len++)
	{
		for(int i = 0; i < n - len; i++)
		{
			int j = i + len;
			if(s[i] == s[j])
			{
				dp[i][j] = dp[i + 1][j - 1];
			}
			else if(s[i] > s[j])
			{
				dp[i][j] = 1;
			}
		}
	}
	int ans = 0;
	for(int i = 0; i < n - 1; i++)
	{
		for(int j = i + 1; j < n; j++)
		{
			ans += dp[i][j];
		}
	}
	cout << ans << endl;
	return 0;
}

具体步骤

寻找状态转移方程。如果 s[i] > s[j]​,那么 dp[i][j] = true。如果 s[i] = s[j]​,那么 dp[i][j] = dp[i + 1][j - 1]​。整体时间复杂度为 O(n^2)。

标签:子串,下标,int,210102,蓝桥,num,2023,new,省赛
From: https://blog.csdn.net/hehe_666888/article/details/141091670

相关文章

  • 蓝桥杯2024年第十五届省赛A组-封印宝石
    题目描述在一次探险中,勇者小蓝发现了n颗闪烁着奇异光芒的宝石,每颗宝石都蕴含着魔法能量,分别记作a1,a2,...,an。小蓝计划用n个特制的魔法盒子来封印这些宝石,防止其魔法能量被滥用。封印宝石会消耗小蓝的体力,具体地,将第i颗宝石放入第j个盒子会消耗小蓝i−j......
  • P9750 [CSP-J 2023] 一元二次方程题目总结
    根据题面,我们将分为多种情况讨论:若a为负数,那么将a,b,c全部取反首先求出data=b^2-4*a*c;1,data<=0cout<<”NO”;否则带入求跟公式:-b/2a+(-)sqrt(data)注意::gcd(a,b)有可能为负数,此处应用abs(x)取绝对值若开根号data为有理数{-b为2*a的倍数则直接输出b否则输出b/gcd(b,2*a......
  • [JOISC 2023 Day3] Tourism
    虚树大小可以从两个角度进行思考:最小斯坦纳树大小,或者,子树内至少有一个标记点的点的数量减去虚树上边的点的数量。前者的优点是简洁,后者的优点是不依赖dfn序的排序。这道题在利用后者的同时,将赋值看作了颜色段,用树链剖分保证了颜色段总数为\(O(n\logn)\),利用了odt。#inc......
  • 2023 信息安全管理与评估赛项任务书(模块一:任务二)-2
    SW:9,11-15配置使北京公司内网用户通过总公司出口BC访问因特网,分公司内网用户通过分公司出口FW访问因特网,要求总公司核心交换机9口VLAN41业务的用户访问因特网的流量往反数据流经过防火墙在通过BC访问因特网;防火墙untrust1和trust1开启安全防护,参数采用默认参数。注:写这道题......
  • OpenSSH 信息泄漏漏洞 (CVE-2023-51385)【低可信】
    详细信息跳转此页面:https://blog.csdn.net/python10101/article/details/140083056?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-3-140083056-blog-137541643.235%5Ev43%5Epc_blog_bottom_relevance_base3......
  • Java计算机毕业设计基于android的健身运动app演示录像220239(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快,健康问题日益受到人们的关注。健身运动作为一种积极的生活方式,不仅能够增强体质、提高免疫力,还能有效缓解工作与生活带来的压......
  • 2024最新版IntelliJ IDEA安装教程(非常详细)从零基础入门到精通,看完这一篇就够了_idea20
    IDEA的使用IDEA的简单介绍IDEA的主要优势IDEA的卸载IDEA的安装第一个程序:HelloWorld结束语IDEA的简单介绍IDEA全称IntelliJIDEA,是Java语言对的集成开发环境,IDEA在业界被认为是公认最好的Java开发工具。IDEA的主要优势✅功能强大①强大的整合能力。比如:GitMavenSp......
  • [CSP-J 2023] 小苹果
    [CSP-J2023]小苹果【官方数据】题目描述小Y的桌子上放着 nn 个苹果从左到右排成一列,编号为从 11 到 nn。小苞是小Y的好朋友,每天她都会从中拿走一些苹果。每天在拿的时候,小苞都是从左侧第 11 个苹果开始、每隔 22 个苹果拿走 11 个苹果。随后小苞会将剩下......
  • [CSP-S 2023] 密码锁
    题目描述小Y有一把五个拨圈的密码锁。如图所示,每个拨圈上是从 00 到 99 的数字。每个拨圈都是从 00 到 99 的循环,即 99 拨动一个位置后可以变成 00 或 88,因为校园里比较安全,小Y采用的锁车方式是:从正确密码开始,随机转动密码锁仅一次;每次都是以某个幅度仅转......
  • 第十五届蓝桥杯大赛青少组——赛前解析(算法)
    算法:进制转换、模拟算法,枚举算法,冒泡排序,插入排序,选择排序,递推算法,递归算法,贪心算法。1.进制转换二进制:只包含0和1八进制:只包含0-7十进制:只包含0-9十六进制:只包含0-9和‘A’-‘F’十进制转二进制、八进制、十六进制十进制数a=5二进制b=bin(a);八进制c=oct(a);十六进......