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


    目录

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

    题目描述

    输入格式

    输出格式

    样例输入

    样例输出

    提示

    【思路解析】

    【代码实现】


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

    时间限制: 3s 内存限制: 320MB 提交: 895 解决: 303

    题目描述

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

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

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

    输入格式

    输入一行包含一个长度为 n 的字符串表示 num(仅包含数字字符 0 ∼ 9),

    从左至右下标依次为 0 ∼ n − 1。

    输出格式

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

    样例输入

    复制

    210102

    样例输出

    复制

    8

    提示

    一共有 8 种不同的方案:

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

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

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

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

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

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

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

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

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

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

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

    【思路解析】

    遍历所有可能性,对于一个子串 i -- j,有3种情况。

    (1)如果str[i] > str[j],可以交换。

    (2) 如果str[i] < str[j],不可以交换。

    (3)如果str[i] ==  str[j],则考虑 子串 i+1 --- j-1,可不可以被交换,如果可以交换,则原子串可以交换,否则不可以被交换。

    【代码实现】

    1. import java.util.Scanner;
    2. /**
    3. * @ProjectName: study3
    4. * @FileName: Ex2
    5. * @author:HWJ
    6. * @Data: 2023/9/17 9:22
    7. */
    8. public class Ex2 {
    9. static int ans = 0;
    10. public static void main(String[] args) {
    11. Scanner input = new Scanner(System.in);
    12. String s = input.next();
    13. char[] str = s.toCharArray();
    14. for (int right = 1; right < str.length; right++) {
    15. for (int left = 0; left < right; left++) {
    16. int L = left + 1;
    17. int R = right - 1;
    18. boolean loop = false;
    19. while (L < R){
    20. if(str[L] > str[R]){
    21. loop = true;
    22. break;
    23. } else if (str[L] < str[R]) {
    24. break;
    25. }else {
    26. L += 1;
    27. R -= 1;
    28. }
    29. }
    30. if (str[left] > str[right] || (loop && str[left] == str[right])){
    31. ans++;
    32. }
    33. }
    34. }
    35. System.out.println(ans);
    36. }
    37. }

  • 相关阅读:
    基于三段式命令及筛选器的rbac权限控制方案
    TCP/IP Illustrated Episode 20
    8.深度学习DNN
    vue3和vue2生命周期对比
    【C语言练习——打印空心正方形及其变形】
    Flask1.1.4 Werkzeug1.0.1 源码分析:启动流程
    WordPress主题网站首页添加好看的四格小工具教程
    开源OA开发平台最新教程:新版消息配置
    如何选择跨平台桌面应用开发框架
    机器学习如何做到疫情可视化——疫情数据分析与预测实战
  • 原文地址:https://blog.csdn.net/weixin_73936404/article/details/132939396