蓝桥杯2023年-更小的数(字符串,推理)

题目描述

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

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

思路

题目意思其实就求该字符串中有多少个翻转后字典序变小的子串。分成两种情况:

情况一:子串首尾不相等,则如果首大于尾,则翻转后肯定会变小。

情况二:子串首尾相等,则看下一个位置,如果还相等,则再看下一个位置,,直到不相等为止。这时再比较大小,如果首大于尾,则翻转后会变小。

优化:情况二其实是情况一的扩展。因为目标都是寻找首大于尾的两个点。则我们可以只寻找首大于尾的两个点,然后往外扩展,直到枚举完两边相等的点,这些子串也符合条件(情况二的逆推过程)。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;cin>>s;
    int ans=0;
    int n=s.size();
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(s[i]>s[j]){
                int temp=1;
                while(i-temp>=0&&j+temp<n&&s[i-temp]==s[j+temp])temp++;
                ans+=temp;
            }
        }
    }
    cout<<ans;
}

相关推荐

  1. 2023-字符串推理

    2024-03-12 04:00:03       42 阅读
  2. [ 2023 省 A] (dp基础应用)

    2024-03-12 04:00:03       32 阅读
  3. 2023-平方差(数学)

    2024-03-12 04:00:03       66 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-12 04:00:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-12 04:00:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-12 04:00:03       87 阅读
  4. Python语言-面向对象

    2024-03-12 04:00:03       96 阅读

热门阅读

  1. Android Selinux详解[二]--新增文件标签相关

    2024-03-12 04:00:03       44 阅读
  2. qwen API调用

    2024-03-12 04:00:03       57 阅读
  3. 【MyBatis-Plus 常用注解详解】

    2024-03-12 04:00:03       39 阅读
  4. react hook: useLayoutEffect

    2024-03-12 04:00:03       46 阅读
  5. 如何优雅的比较两个对象是否相等

    2024-03-12 04:00:03       43 阅读
  6. 在并发场景如何正确的使用锁机制呢?

    2024-03-12 04:00:03       44 阅读