当前位置: 首页 > news >正文

蓝桥杯 第十天 :2022 国赛 第 2 题 排列距离/康托定理

实际上就是求字典序:

假设我们有 3 个数字:1, 2, 3。

  • 排列组合总数: 3! = 3 * 2 * 1 = 6 种。 这 6 种排列分别是:

    1. 1 2 3
    2. 1 3 2
    3. 2 1 3
    4. 2 3 1
    5. 3 1 2
    6. 3 2 1
  • 康托展开:

    • 对于排列 2 1 3,康托展开计算的结果是 2。这意味着 2 1 3 在所有 6 种排列中,按字典序排在第 3 位(因为从 0 开始计数)。
    • 对于排列 3 2 1,康托展开计算的结果是 5。这意味着 3 2 1 在所有 6 种排列中,按字典序排在第 6 位。
    • 对于排列 1 2 3, 康托展开计算的结果是0。这意味着 1 2 3 在所有6种排列中,按字典序排在第 1 位。
          private static final String A = "aejcldbhpiogfqnkr";
          private static final String B = "ncfjboqiealhkrpgd";
      
          public static void main(String[] args) {
              // 计算排列B相对于排列A的位置差
              long t = tak(B) - tak(A);
              // 如果t是负数,则取绝对值
              t = Math.abs(t);//这个就是顺着排的值
              // 取最小值,即从A到B或者从B到A的最小步数
              t = Math.min(t, check(17) - t);//看看是顺着排还是逆着排
              // 输出结果
              System.out.println(t);
          }
      
          // 计算阶乘
          private static long check(int n) {//17个数的全排列一共有多少个
              if (n == 0) return 0;
              long t = 1;
              // 计算n的阶乘
              for (int i = 1; i <= n; i++)
                  t *= i;
              return t;
          }
      
          // 计算排列a在次序,能排第几个
          private static long tak(String a) {
              long ans = 0;
              // 对于排列a的每一个字符
              for (int i = 0; i < a.length(); i++) {
                  int t = 0;
                  // 计算在当前位置之后有多少个小于当前字符的字符
                  for (int j = i + 1; j < a.length(); j++) {
                      if (a.charAt(j) < a.charAt(i))
                          t++;
                  }
                  // 根据康托展开公式计算当前位置的贡献
                  ans += check(a.length() - 1 - i) * t;//t乘阶乘
              }
              return ans;
          }

相关文章:

  • 20242817李臻《Linux⾼级编程实践》第四周
  • 使用 Python 实现时间序列预测:电力负载需求预测
  • SpringCloud负载均衡:Ribbon核心组件与策略配置
  • 【C++】:异常
  • 如何优化 React 应用性能?
  • Hugo 生成静态网站并部署到 GitHub Pages 的完整流程
  • 深入解析MediaPipe:强大的实时计算机视觉框架
  • 自由学习记录(45)
  • OBOO鸥柏丨广告机终端控制端KylinOS麒麟、统信UOS/鸿蒙国产系统
  • CTF类题目复现总结-[WUSTCTF2020]find_me 1
  • Flutter 快速接入Fair
  • PostgreSQL 数据库中导入大量数据
  • 如何为在线游戏选择合适的游戏盾?
  • .NET8使用EF Core连接SQLite
  • vue3之写一个aichat---已聊天组件部分功能
  • 快速部署Linux + Ollama + AnythingLLM + Deepseek
  • CEF 多进程模式时,注入函数,获得交互信息
  • 关于 2>/dev/null 的作用以及机理
  • 半导体制造行业的现状 内检LIMS系统在半导体制造的应用
  • EJS缓存解决多页面相同闪动问题
  • 广东早熟荔枝“抢滩”上海,向长三角消费者喊话:包甜,管够
  • 排污染黑海水后用沙土覆盖黑泥?汕尾环保部门:非欲盖弥彰
  • 回望乡土:对媒介化社会的反思
  • 老镇老宅楼:破旧,没产证,要不要更新?
  • 郑州通报“夜市摊贩收取香烟交给城管”:涉事人员停职调查
  • 非洲雕刻艺术有着怎样的“变形之美”