【编程测试题】数列还原

2023-11-17

数列还原

题目描述

牛牛的作业薄上有一个长度为 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 个)。

输出描述:

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

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;
//http://www.nowcoder.com/questionTerminal/b698e67a2f5b450a824527e82ed7495d
 
int a[105];
bool appear[105];
int missidx[15];
int missnum[15];
int misscnt=0;
int smaller[105][105];
int larger[105][105];
 
int calc_orderedPairs(int *num,int n){
    int ans=0;
    for(int i=1;i<n;i++){
        if(num[i])
            for(int j=0;j<i;j++){
                if(num[j]&&num[j]<num[i]){
                    ++ans;
                }
            }
    }
    return ans;
}
 
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    if(k>n*(n-1)/2){
        puts("0");
        return 0;
    }
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        if(!a[i])missidx[misscnt++]=i;
        else appear[a[i]]=1;
    }
    misscnt=0;
    for(int i=1;i<=n;i++){
        if(!appear[i]){
            missnum[misscnt++]=i;
        }
    }
     
    //given inner
    int given=calc_orderedPairs(a,n);
    if(given>k){
        puts("0");
        return 0;
    }
     
    //given and not given
    for(int i=0;i<misscnt;++i){
        int small=0,large=0;
        for(int j=0;j<n;j++){
            if(!a[j]){
                smaller[j][missnum[i]]=small;
            }
            else if(a[j]<missnum[i])++small;
        }
        for(int j=n-1;j>=0;--j){
            if(!a[j]){
                larger[j][missnum[i]]=large;
            }
            else if(a[j]>missnum[i])++large;
        }
    }
     
    int ans=0;
    //not given
    do{
        int inner=calc_orderedPairs(missnum,misscnt);
        for(int i=0;i<misscnt;++i){
            inner+=smaller[missidx[i]][missnum[i]];
            inner+=larger[missidx[i]][missnum[i]];
        }
        if(inner+given==k) ++ans;
    }while(next_permutation(missnum,missnum+misscnt));
     
    printf("%d\n",ans);
    return 0;
}

牛人真多。。。

先统计哪些数没出现,哪些位置缺少数值。

然后考虑计算。

10!=3628800

如果是每种排列还暴力计算(~100*100),这不行,太慢了

考虑预先计算一部分。

总顺序对数=已经填进去的数之间的顺序对数+没有填进去的数之间的顺序对数+已经填进去和没有填进去的数之间的顺序对数

第一部分:预先算一遍就好了

第二部分:只有10*10,暴力计算

第三部分:预先处理,每个数填在空位上,和其他预先填进去的数组成的顺序对数

三部分相加,判断等不等于k就行。

计算量?

10*10+10,也就110

所以你看,<1ms过了

(呃,其实数据太弱有关系吧)



 

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

【编程测试题】数列还原 的相关文章

  • Inorder Successor in BST

    Given a binary search tree and a node in it find the in order successor of that node in the BST Note If the given node h
  • UNI-APP_APP(webview)集成X5内核

    官方文档 https uniapp dcloud net cn tutorial app android x5 html 腾讯TBS x5内核仅支持Android平台 iOS只能使用自带的WKWebview 打开项目的manifest js
  • Linux awk 命令

    AWK是一种处理文本文件的语言 是一个强大的文本分析工具 之所以叫AWK是因为其取了三位创始人 Alfred Aho Peter Weinberger 和 Brian Kernighan 的Family Name的首字符 语法 awk 选项
  • Keil环境下CANopenNode移植到STM32问题记录(一)---printf重定向问题

    文章目录 问题描述 问题结决 思考 相关文章 在直接将CANopenSTM32的示例工程直接移植到Keil环境下 如果移植工程未实现printf函数重定向 则要注释掉log printf下面的printf函数 使日志打印失效 Printf
  • SQL注入之盲注

    SQL注入之盲注 前言 一 盲注分类 二 具体解析 1 基于布尔的sql盲注 首先要先了解一下sql注入截取字符串常用的函数 1 mid 函数 2 substr 函数 3 left 函数 具体注入方法 2 基于时间的SQL盲注 3 基于报错

随机推荐

  • Java实验3与第五周总结

    1 已知字符串 this is a test of java 按要求执行以下操作 要求源代码 结果截图 统计该字符串中字母s出现的次数 统计该字符串中子串 is 出现的次数 统计该字符串中单词 is 出现的次数 实现该字符串的倒序输出 pu
  • BT5, depends* but it is not going to be installed 解决方法

    apt get install 任何包都缺少依赖项 执行以下命令 apt get f install 然后在 apt get install package package 你要安装的包 比如我安装的open vm tools 就成功了 后
  • VSCode代码自动补全(html标签、style样式、css属性及值)

    转自 传送门 1 按CTRL SHIFT P 2 输入搜索Suggest Snippets Prevent Quick Suggestions 控制在活动代码片段内是否禁用快速建议 3 取消选中 4 按CTRL SHIFT P输入搜索 Fi
  • 利用cygwin编译cholmod以获得在windows上可用的库lib

    原文http blog parlin me complie cholmod to get library for win64 记录要点 cygwin好好装 希望哪位神人能够提供一个好用的cygwin国内mirror 编译cholmod的时候
  • 同源策略与跨域

    前言 最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的问题访问不到 大致看了下腾讯云关于设置跨域访问的教程 按照前端同学给的域名等选项就给配了 而且测试下来也是好的 但是呢一直不知道什么是跨域这里就做一个简单的学习记录 一
  • 批量给多台Android手机安装APK脚本

    问题场景 测试让开发给4台手机安装测试版的APK 现实跑4次程序 于是该程序说 要是有个一次性安装多台手机APK的方法就好了 于是该脚本就出现了 并且还可以安装多个apk 以上是2个apk同时给2台设备安装 一键即可 把需要安装的apk放到
  • 百度AI接口测试案列一:车牌识别

    1 打开百度AI网站 百度AI网站 2 登录百度账号 进入控制台 选择文字识别服务 如图 3 点击立即使用 然后创建应用 之后输入应用名称 描述 随便写 并选择应用类型 之后点击 立即创建 按钮 创建完毕 点击 返回应用列表 如下图 注 A
  • linux删除文件_Linux中如何删除常用方式无法删除的文件

    前言 我们都知道 在linux删除一个文件可以使用rm命令 但是有一些特殊名称的文件使用普通的rm方式却没法删除 本文介绍linux中删除特殊名称文件的多种方式 linux文件命名规则 在介绍之前 简单说明一下linux中文件命名规则 文件
  • RegExp正则表达式-基本语法

    RegExp 百度云资料 密码 f89c 里面有详细的语法跟例子 希望对大家有帮助 课前补充 转义字符 多行字符串 字符串换行符 n RegExp作用 匹配特殊字符或有特殊搭配原则的字符的最佳选择 创建方式 直接量 推荐 new RegEx
  • Python 装饰器深入解析

    1 什么是装饰器 装饰器是给现有的模块增添新的小功能 可以对原函数进行功能扩展 而且还不需要修改原函数的内容 也不需要修改原函数的调用 1 1 装饰器的使用符合了面向对象编程的开放封闭原则 开放封闭原则主要体现在两个方面 对扩展开放 意味着
  • [LeetCode]4 两个有序数组的中位数

    Median of Two Sorted Arrays 两个有序数组的中位数 难度 hard There are two sorted arrays nums1 and nums2 of size m and n respectively
  • webstorm vue 项目卡顿现象 解决

    Settings editor File Types ignore files and folders 要忽略的文件添加 node modules 然后点击应用 在项目中点击node modules 右键 Mark Directory as
  • CMAKE 工具 之 add_executable,include_directories和 AUX_SOURCE_DIRECTORY

    在上一章里面 我们用cmake做了一个最简单的项目 这一节我们尝试一写比较常见的cmake配置 这次我们构建如下的目录结构 其中int plus h的代码如下 int int plus const int a const int b int
  • 【经验贴】新手项目经理如何接手并管好项目?

    最近有刷到这样一些求助帖 初入职场两三年的项目经理现在开始独立带项目 由于缺乏经验不知道从何下手 询问如何能快速接手并管好项目呢 这个话题也引起了大家的热议 今天就给大家分享一下一些实践经验 1 刚拿到项目时 应该做哪些准备 新接手项目时
  • Octave 计算数据 from 吴恩达的机器学习

    1 乘积 A C 2 点乘 A B 将矩阵A中的元素点乘B中的对应元素相乘 A 2 对矩阵A中的每一个元素平方 1 A 得到每一个元素的倒数 3 log A 对每个元素进行求对数运算 4 exp A 自然数e的幂次运算 就是以e为底 以这些
  • MySql8.0以上版本安装

    一 下载mysql8 0 1 官网地址 https www mysql com 2 进入下载页面 3 选择版本下载 二 安装mysql 1 配置环境变量 变量名 MYSQL HOME 变量值 mysql存放路径 例如 D mysql 8 0
  • postgresql 扩展pg_cron,pg_stat_statements安装配置

    一 概述 pg cron是基于cron的作业调度插件 语法与常规cron相同 但它可以直接从数据库执行PostgreSQL命令 pg stat statements模块提供一种方法追踪一个服务器所执行的所有 SQL 语句的执行统计信息 可以
  • 技术和商业角度刷脸支付都将成为未来趋势

    刷脸支付 我们作为消费者来说 最直观的感受就是我们的支付方式发生了变化 付钱更方便了 从最开始我们带着现金出门买东西 到后来二维码支付 一个手机扫遍天下 对于商家来说他不需要停下来手中在做的事情来收钱找零 而对于我们消费者来说也是非常的快捷
  • Python 内置数据类型 03----元组

    目 录 1 元组的简介 1 1 元组概念 1 2 元组创建方式 1 2 1 使用 直接创建 1 2 2 使用 tuple 函数创建 1 3 元组访问方式 2 处理元组的内置函数 2 1 len 函数 2 2 max 函数 2 3 min 函
  • 【编程测试题】数列还原

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