牛客网 之 数列还原(数列的全排列算法)

2023-11-10

题目描述

牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因,其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,顺序对是指满足 i < j 且 A[i] < A[j] 的对数,请帮助牛牛计算出,符合这个要求的合法排列的数目。

输入描述:

每个输入包含一个测试用例。每个测试用例的第一行包含两个整数 n 和 k(1 <= n <= 100, 0 <= k <= 1000000000),接下来的 1 行,包含 n 个数字表示排列 A,其中等于0的项表示看不清的位置(不超过 10 个)。

输出描述:

输出一行表示合法的排列数目。

示例1

输入

5 5
4 0 0 2 0

输出

2

思路

首先,求出已有数列的顺序对。
然后,将模糊的数字统计出来,并求出这些数字的全排列。
最后,循环遍历模糊数列的排序,把模糊数列放在原数列上,求每个模糊数字在整个数列中产生的顺序对。
关键:如何求全排列(需要递归的求出所有排列)

AC代码


import java.util.*;

/**
 * @Auther: ~
 * @Date: 2018/8/30 11:24
 * @Description: 数列还原 别人的思路 数列全排列的算法看不懂就记住好了
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int k = scanner.nextInt();
        int[] ints = new int[n];
        //flag标记哪些数字已经存在
        boolean[] bl = new boolean[n + 1];
        for (int i = 0; i < n; i++) {
            ints[i] = scanner.nextInt();
            if (ints[i] != 0) {
                bl[ints[i]] = true;
            }
        }

        //统计排列中不存在的数字
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            if (bl[i] == false) {
                list.add(i);
            }
        }

        //perm用来存模糊数字的全排列
        List<ArrayList<Integer>> perm = new ArrayList<ArrayList<Integer>>();
        //计算perm
        calperm(perm, list, 0);

        //统计已有排列的顺序对
        int cv = 0;
        for (int i = 0; i < n - 1; i++) {
            if (ints[i] != 0) {
                for (int j = i + 1; j < n; j++) {
                    if (ints[j] != 0 && ints[j] > ints[i]) {
                        cv++;
                    }
                }
            }
        }

        int res = 0;
        //计算每个模糊数字排列的顺序对,如果与k相等,则结果res+1
        for (ArrayList<Integer> item : perm) {
            int val = cv;
            int[] temp = Arrays.copyOf(ints, n);
            val += calvalue(item, temp);
            if (val == k) {
                res++;
            }
        }
        System.out.println(res);
    }

    //计算排列的顺序对
    static int calvalue(ArrayList<Integer> item, int[] temp) {
        int j=0;
        int val=0;
        for (int i=0;i<temp.length;i++){
            if(temp[i]==0){
                temp[i]= item.get(j++);
                for (int k=0;k<i;k++){
                    if(temp[k]<temp[i]){
                        val++;
                    }
                }
                for (int k=i+1;k<temp.length;k++){
                    if(temp[k]>temp[i]){
                        val++;
                    }
                }
            }
        }
        return val;
    }

    //计算全排列 记住好了
    public static void calperm(List<ArrayList<Integer>> perm, ArrayList<Integer> list, int n) {
        if (n == list.size()) {
            perm.add(new ArrayList<Integer>(list));
        } else {
            for (int i = n; i < list.size(); i++) {
                Collections.swap(list, i, n);
                calperm(perm, list, n + 1);
                Collections.swap(list, i, n);
            }
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

牛客网 之 数列还原(数列的全排列算法) 的相关文章

随机推荐

  • 【华为 OD】

    目录 一 题目描述 二 输入描述 三 输出描述 用例 四 题目解析 五 Java玩法 六 JavaScript玩法 一 题目描述 给定一组数字 表示扑克牌的牌面数字 忽略扑克牌的花色 请按如下规则对这一组扑克牌 进行整理 步骤 1 对扑克牌
  • 备份技术

    备份技术 备份技术是灾难恢复技术的一个基础 没有使用备份技术进行全面 及时以及准确的备份 就无法进行灾难恢复 1 备份策略 备份策略的制定是备份系统的一个重要部分 备份策略的选择依赖于数据的重要性 允许备份的可用时间以及其他的一些因素 一般
  • 序列化与反序列化(1)Serializable —— Java原生态方法

    摘自 序列化与反序列化 1 Serializable Java原生态方法 作者 丶PURSUING 发布时间 2021 05 08 19 20 21 网址 https blog csdn net weixin 44742824 articl
  • windows11安装docker时,修改默认安装到C盘

    1 修改默认安装到C盘 2 如果之前安装过docker 请删除如下目录 C Program Files Docker 3 在D盘新建目录 D Program Files Docker 4 win r 以管理员权限运行cmd 5 在cmd中执
  • MySQL权限详解

    本文为joshua317原创文章 转载请注明 转载自joshua317博客 https www joshua317 com article 55 MySQL提供了哪些权限 MySQL提供的权限列表如图所示 其中 All或者Allprivil
  • 一步一步学区块链(1)概念了解

    区块链是分布式数据存储 点对点传输 共识机制 加密算法等计算机技术的 新型应用模式 所谓共识机制是区块链系统中实现不同节点之间建立信任 获取权益的数学算法 含义 比特币 BitCoin 的概念最初由中本聪在2009年提出 根据中本聪的思路设
  • PageHelper中的RowBounds

    RowBounds是处理ResultSet结果集进行分页 也就是说是mybatis默认实现是逻辑分页 并不是物理分页 但PageHelper将这个类利用起来进行了物理分页 PageHelper的其中一种使用方式就是将RowBounds参数获
  • DRM驱动代码分析:色彩管理

    高通PQ有哪些子模块 DSPP sub blocks SDE DSPP IGC DSPP Inverse gamma correction block SDE DSPP PCC Panel color correction block SD
  • Linux Ubuntu安装多个cuda版本

    因为pytorch版本与cuda版本有一定的对应要求 服务器上的cuda是不能自己随便动的 所以需要在自己账户中安装其他版本的cuda 而不能影响其他账户中已安装的cuda 这里参考了多篇博文总结出以下要点 1 nvcc和nvidia sm
  • 攻防世界 shrine 详解

    打开题目 整理源码 代码审计 目标 config FLAG 过滤了 config self 这两个函数的过滤没看懂 总之好像也没过滤掉 应该是过滤了后面的变量 圆括号是彻底的被过滤掉了 URL编码都没用 刚开始想测试XSS来着 做完后 拿编
  • JS数组过滤 简单------->多条件筛选

    在前端部分完成筛选功能 一次拿到所有数据 然后根据条件筛选 通常情况下筛选是后台给接口 在数据量不大的情况下 也有人可能会遇到前端筛选这样的情况 这个是例子中的被筛选数组 var aim name Anne age 23 gender fe
  • 最强大脑(9-10)

    目录 第九季 团队冲击赛 乾坤魔方 运Q帷幄 光影残卷 光柱霓虹 六宫数局 双面拼图 索玛秘图 康斯迭代 第九季 淘汰赛 慧眼识金 连杆曲线 光点密钥 希尔伯特旋涡 移星掠形 星阵潜袭 明灯谜局 彩虹雪花 光图谜笼 战旗阵地 时间旅人 数字
  • [开发] 认证的几种方式简介

    LDAP 认证 LDAP 轻量级目录访问协议 是一种用于访问和维护分布式目录信息的开放标准协议 它最初由电子数据系统公司 Netscape 开发 现在被广泛用于企业和组织中的身份认证和授权管理 LDAP的目标是为不同类型的应用程序 如电子邮
  • 创作灵感打卡

    打卡 打卡 打卡 重要的事情说三遍 作为一个CSDN新手 目标就是 坚持下来 每日分享关于C语言知识 希望在CSDN平台上可以走的更远 今日刚刚发布几篇博客 兴趣大发 希望同僚可以给以鼓励 使得坚持下来
  • RPNet 分割

    46m https github com ooooverflow BiSeNet 网络好像比较大 无模型 https github com superlxt RPNet Pytorch solov2 还未开源 yolact map不到30
  • VS Code 配置C/C++环境 出现问题 could not find the task 'g++' / 'gcc'

    前言 由于新电脑未装VSCode C C 配置环境 刚好手头有些东西想在上面验证 于是开启安装之旅 耗时大概4h 最后还是拷了旧电脑的配置 修改过后才解决的问题 如果你是被标题 骗 进来的 请直接跳转到tasks json部分 推荐先序阅读
  • csu 1803 2016 2016湖南省赛 A

    Problem acm csu edu cn csuoj problemset problem pid 1803 vjudge net contest 161962 problem A Reference www cnblogs com w
  • Day【3】设计一个支持增量功能的栈

    原题链接 文章目录 思路 代码 用数组来模拟栈 思路 题目中已经确切的告诉了我们 数组中会放入多少个元素 这种情况并且只有添加操作 这种情况之下 使用数组模拟效率会更高一点 代码 用数组模拟栈 击败100 class CustomStack
  • 多链生态中的跨链桥是如何运行的?

    在以太坊升级之前 它网络拥堵 手续费高昂等问题逐渐难以满足人们的需求 因此 市场中出现了许多以太坊之外的公链 其中甚至不乏有一些号称 以太坊杀手 项目 尽管以太坊很快反应过来了 并开始对其自身进行升级优化 但一个多链的生态已然形成 在多链态
  • 牛客网 之 数列还原(数列的全排列算法)

    题目描述 牛牛的作业薄上有一个长度为 n 的排列 A 这个排列包含了从1到n的n个数 但是因为一些原因 其中有一些位置 不超过 10 个 看不清了 但是牛牛记得这个数列顺序对的数量是 k 顺序对是指满足 i lt j 且 A i lt A