2021-10-26:给定一个数组arr,arr[i] = j,表示第i号试题的难度为j。给定一个非负数M。想出一张卷子,对于任何相邻的两道题目,前一题的难度不能超过后一题的难度+M。返回所有可能的卷
2021-10-26:给定一个数组arr,arr[i] = j,表示第i号试题的难度为j。给定一个非负数M。想出一张卷子,对于任何相邻的两道题目,前一题的难度不能超过后一题的难度+M。返回所有可能的卷子种数。
答案2021-10-26:
方法1:递归。纯暴力方法,生成所有排列,一个一个验证。
方法2:从左往右的动态规划 + 范围上二分。时间复杂度O(N * logN)。
方法3:从左往右的动态规划 + IndexTree。时间复杂度O(N * logV)。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math"
"sort"
)
func main() {
if true {
arr := []int{1, 5, 3, 4, 2}
ret := ways1(arr, 3)
fmt.Println(ret)
}
if true {
arr := []int{1, 5, 3, 4, 2}
ret := ways2(arr, 3)
fmt.Println(ret)
}
if true {
arr := []int{1, 5, 3, 4, 2}
ret := ways3(arr, 3)
fmt.Println(ret)
}
}
// 纯暴力方法,生成所有排列,一个一个验证
func ways1(arr []int, m int) int {
if len(arr) == 0 {
return 0
}
return process(arr, 0, m)
}
func process(arr []int, index int, m int) int {
if index == len(arr) {
for i := 1; i < index; i++ {
if arr[i-1] > arr[i]+m {
return 0
}
}
return 1
}
ans := 0
for i := index; i < len(arr); i++ {
arr[index], arr[i] = arr[i], arr[index]
ans += process(arr, index+1, m)
arr[index], arr[i] = arr[i], arr[index]
}
return ans
}
// 时间复杂度O(N * logN)
// 从左往右的动态规划 + 范围上二分
func ways2(arr []int, m int) int {
if len(arr) == 0 {
return 0
}
//Arrays.sort(arr);
sort.Ints(arr)
all := 1
for i := 1; i < len(arr); i++ {
all = all * (num(arr, i-1, arr[i]-m) + 1)
}
return all
}
// arr[0..r]上返回>=t的数有几个, 二分的方法
// 找到 >=t 最左的位置a, 然后返回r - a + 1就是个数
func num(arr []int, r int, t int) int {
i := 0
j := r
m := 0
a := r + 1
for i <= j {
m = (i + j) / 2
if arr[m] >= t {
a = m
j = m - 1
} else {
i = m + 1
}
}
return r - a + 1
}
// 时间复杂度O(N * logV)
// 从左往右的动态规划 + IndexTree
func ways3(arr []int, m int) int {
if len(arr) == 0 {
return 0
}
max := math.MinInt64
min := math.MaxInt64
for _, num := range arr {
max = getMax(max, num)
min = getMin(min, num)
}
itree := NewIndexTree(max - min + 2)
//Arrays.sort(arr);
sort.Ints(arr)
a := 0
b := 0
all := 1
itree.add(arr[0]-min+1, 1)
for i := 1; i < len(arr); i++ {
a = arr[i] - min + 1
if a-m-1 >= 1 {
b = i - itree.sum(a-m-1)
} else {
b = i
}
//b = i - (a - m - 1 >= 1 ? itree.sum(a - m - 1) : 0);
all = all * (b + 1)
itree.add(a, 1)
}
return all
}
func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}
func getMin(a, b int) int {
if a < b {
return a
} else {
return b
}
}
// 注意开始下标是1,不是0
type IndexTree struct {
tree []int
N int
}
func NewIndexTree(size int) *IndexTree {
res := &IndexTree{}
res.N = size
res.tree = make([]int, size+1)
return res
}
func (this *IndexTree) sum(index int) int {
ret := 0
for index > 0 {
ret += this.tree[index]
index -= index & -index
}
return ret
}
func (this *IndexTree) add(index, d int) {
for index <= this.N {
this.tree[index] += d
index += index & -index
}
}
执行结果如下:

2021-10-26:给定一个数组arr,arr[i] = j,表示第i号试题的难度为j。给定一个非负数M。想出一张卷子,对于任何相邻的两道题目,前一题的难度不能超过后一题的难度+M。返回所有可能的卷的更多相关文章
- Noip模拟83 2021.10.26
T1 树上的数 有手就能在衡中$OJ$上过,但是$WaitingCoders$不行,就是这样 必须使用$O(n)$算法加上大力卡常,思路就是找子树内没更新的更新,更新过了直接$return$ 1 #i ...
- 关于fork有意思的两道题目
http://www.spongeliu.com/123.html 第一题,计算下面代码理论上总共打印了多少行:(网易2011笔试题) #include #include #include int m ...
- 2021.10.26考试总结[冲刺NOIP模拟16]
T1 树上的数 \(DFS\)一遍.结构体存边好像更快? \(code:\) T1 #include<bits/stdc++.h> using namespace std; namespa ...
- IDEA 激活码,最新激活码,亲测有效,持续更新(2021.10.26)
这里整理了一份 IntelliJ IDEA的最新激活码,持续更新 获取链接:[腾讯文档]分享白嫖JB Account和激活码(并附带破解工具) https://docs.qq.com/doc/DVnB ...
- 日常Java 2021/10/26
HashSet基于HashMap来实现的,是一个不允许有重复元素的集合.HashSet 允许有null 值. HashSet是无序的,即不会记录插入的顺序. HashSet不是线程安全的,如果多个线程 ...
- 这两道题目很相似 最优还钱方式 & 除法推导
http://www.cnblogs.com/grandyang/p/6108158.html http://www.cnblogs.com/grandyang/p/5880133.html 都是根据 ...
- 算法题——给定一个数组 arr,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
参考自:https://blog.csdn.net/qq_38200548/article/details/80688630 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] ...
- 【OI新闻】2016.10.26 - NOIP初赛泄题再次引爆
有点劲,开车注意点,小心翻啦~ http://www.noi.cn/noi-news/noi/743-ccfnoip2016 CCF在NOIP2016初赛结束后接到举报:初赛前(22日12时左右),网 ...
- vue多个input绑定一个数组变量问题
对于data中声明的一个数组变量arr=[],在绑定时候可以如下: <div style="margin-top: 10px;margin-left: 40px;"> ...
- 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序
题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序 public static int maxGap(int nums[]) { if ( ...
随机推荐
- 在 Sitecore 里使用 Solr 搜索 SortOrder 关联的 Item
在 C# 使用 Solr 搜索 sitecore 的配置信息文件可直接丢进 <Instance>\App_Config 下,sitecore 会自动检测配置文件更新并加载到内存中. 通常情 ...
- 近期调研和使用 zeromq 与 cppzmq 的一些问题
关于message 消息分片 消息分片的发送 消息分片允许将多个消息封装成一条消息.在发送自定义协议数据时,我们经常需要在消息前"填充"一个包头.如下代码,在发送的时候加上 zmq ...
- 如何使用 vue + intro 实现后台管理系统的引导
引言 为了让用户更好的适应新版,或更方便使用公司内部系统,可以加入新手指引功能.如果你也想在自己的网页加入用户指引,那就试试在 vue 中使用 Intro.js 吧,它能够很轻松的制作出新手指引的效果 ...
- Windows Powershell无法切换anaconda的问题
前言 近期做大创发现power shell启动以后activate环境之后没有反应,遂进行如下操作 启用默认配置 使用管理员模式打开Powershell 输入conda init powershell ...
- 基于docker和cri-dockerd部署k8sv1.26.3
cri-dockerd是什么? 在 Kubernetes v1.24 及更早版本中,我们使用docker作为容器引擎在k8s上使用时,依赖一个dockershim的内置k8s组件:k8s v1.24发 ...
- [issues] webrtc 接入SRS丢包率不正确问题
目录 [issues] webrtc 接入SRS丢包率不正确问题 原因和解决方法 srs增加rtx SDP协商 构建RTX包 [issues] webrtc 接入SRS丢包率不正确问题 原因和解决方法 ...
- ggplot2图形可视化应用集锦
数据可视化就是将我们从数据中探索的信息与图形要素对应起来的过程.数据可视化,先要理解数据,再去掌握可视化的方法,这样才能实现高效的数据可视化.数据可视化技术的基本思想,是将数据库中每一个数据项作为单个 ...
- Python常见面试题016. 请实现如下功能|谈谈你对闭包的理解
016. 请实现如下功能|谈谈你对闭包的理解 摘自<流畅的python> 第七章 函数装饰器和闭包 实现一个函数(可以不是函数)avg,计算不断增加的系列值的平均值,效果如下 def av ...
- LeeCode 713 乘积小于k的子数组
LeeCode 713 题目描述: 给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目. 标签: 双指针.滑动窗口 建立模型 枚举子数组的右端 ...
- Oracle AUD审计 找出锁定用户的客户端IP
问题描述:运用AUD审计找出锁定用户的客户端IP 1.查询被锁用户 SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE FROM DBA_USERS WHERE AC ...