2021-12-17:长城守卫军问题。
长城上有连成一排的n个烽火台,每个烽火台都有士兵驻守。
第i个烽火台驻守着ai个士兵,相邻峰火台的距离为1。另外,有m位将军,
每位将军可以驻守一个峰火台,每个烽火台可以有多个将军驻守,
将军可以影响所有距离他驻守的峰火台小于等于x的烽火台。
每个烽火台的基础战斗力为士兵数,另外,每个能影响此烽火台的将军都能使这个烽火台的战斗力提升k。
长城的战斗力为所有烽火台的战斗力的最小值。
请问长城的最大战斗力可以是多少?
输入描述
第一行四个正整数n,m,x,k(1<=x<=n<=105,0<=m<=105,1<=k<=10^5)
第二行n个整数ai(0<=ai<=10^5)
输出描述 仅一行,一个整数,表示长城的最大战斗力
样例输入
5 2 1 2
4 4 2 4 4
样例输出
6
来自360。

答案2021-12-17:

这道题很难。
从业务里找限制。
1.二分答案。
2.类似于AOE贪心。
3.线段树。
时间复杂度:未知。
空间复杂度:未知。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
wall := []int{3, 1, 1, 1, 3}
m := 2
x := 3
k := 1
fmt.Println(maxForce(wall, m, x, k))
} func maxForce(wall []int, m, x, k int) int {
L := 0
R := 0
for _, num := range wall {
if num > R {
R = num
}
}
R += m * k
ans := 0
for L <= R {
M := (L + R) / 2
if can(wall, m, x, k, M) {
ans = M
L = M + 1
} else {
R = M - 1
}
}
return ans
} func can(wall []int, m, x, k, limit int) bool {
N := len(wall)
// 注意:下标从1开始
st := NewSegmentTree(wall)
st.build(1, N, 1)
need := 0
for i := 0; i < N; i++ {
// 注意:下标从1开始
cur := st.query(i+1, i+1, 1, N, 1)
if cur < limit {
add := (limit - cur + k - 1) / k
need += add
if need > m {
return false
}
st.add(i+1, getMin(i+x, N), add*k, 1, N, 1)
}
}
return true
} func getMin(a, b int) int {
if a < b {
return a
} else {
return b
}
} type SegmentTree struct {
MAXN int
arr []int
sum []int
lazy []int
change []int
update0 []bool
} func NewSegmentTree(origin []int) *SegmentTree {
ret := &SegmentTree{}
ret.MAXN = len(origin) + 1
ret.arr = make([]int, ret.MAXN)
for i := 1; i < ret.MAXN; i++ {
ret.arr[i] = origin[i-1]
}
ret.sum = make([]int, ret.MAXN<<2)
ret.lazy = make([]int, ret.MAXN<<2)
ret.change = make([]int, ret.MAXN<<2)
ret.update0 = make([]bool, ret.MAXN<<2)
return ret
} func (this *SegmentTree) pushUp(rt int) {
this.sum[rt] = this.sum[rt<<1] + this.sum[rt<<1|1]
} func (this *SegmentTree) pushDown(rt, ln, rn int) {
if this.update0[rt] {
this.update0[rt<<1] = true
this.update0[rt<<1|1] = true
this.change[rt<<1] = this.change[rt]
this.change[rt<<1|1] = this.change[rt]
this.lazy[rt<<1] = 0
this.lazy[rt<<1|1] = 0
this.sum[rt<<1] = this.change[rt] * ln
this.sum[rt<<1|1] = this.change[rt] * rn
this.update0[rt] = false
}
if this.lazy[rt] != 0 {
this.lazy[rt<<1] += this.lazy[rt]
this.sum[rt<<1] += this.lazy[rt] * ln
this.lazy[rt<<1|1] += this.lazy[rt]
this.sum[rt<<1|1] += this.lazy[rt] * rn
this.lazy[rt] = 0
}
} func (this *SegmentTree) build(l, r, rt int) {
if l == r {
this.sum[rt] = this.arr[l]
return
}
mid := (l + r) >> 1
this.build(l, mid, rt<<1)
this.build(mid+1, r, rt<<1|1)
this.pushUp(rt)
} func (this *SegmentTree) update(L, R, C, l, r, rt int) {
if L <= l && r <= R {
this.update0[rt] = true
this.change[rt] = C
this.sum[rt] = C * (r - l + 1)
this.lazy[rt] = 0
return
}
mid := (l + r) >> 1
this.pushDown(rt, mid-l+1, r-mid)
if L <= mid {
this.update(L, R, C, l, mid, rt<<1)
}
if R > mid {
this.update(L, R, C, mid+1, r, rt<<1|1)
}
this.pushUp(rt)
} func (this *SegmentTree) add(L, R, C, l, r, rt int) {
if L <= l && r <= R {
this.sum[rt] += C * (r - l + 1)
this.lazy[rt] += C
return
}
mid := (l + r) >> 1
this.pushDown(rt, mid-l+1, r-mid)
if L <= mid {
this.add(L, R, C, l, mid, rt<<1)
}
if R > mid {
this.add(L, R, C, mid+1, r, rt<<1|1)
}
this.pushUp(rt)
} func (this *SegmentTree) query(L, R, l, r, rt int) int {
if L <= l && r <= R {
return this.sum[rt]
}
mid := (l + r) >> 1
this.pushDown(rt, mid-l+1, r-mid)
ans := 0
if L <= mid {
ans += this.query(L, R, l, mid, rt<<1)
}
if R > mid {
ans += this.query(L, R, mid+1, r, rt<<1|1)
}
return ans
}

执行结果如下:


左神java代码

2021-12-17:长城守卫军问题。 长城上有连成一排的n个烽火台,每个烽火台都有士兵驻守。 第i个烽火台驻守着ai个士兵,相邻峰火台的距离为1。另外,有m位将军, 每位将军可以驻守一个峰火台,每个的更多相关文章

  1. 2021.07.17 P3177 树上染色(树形DP)

    2021.07.17 P3177 树上染色(树形DP) [P3177 HAOI2015]树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.dp思想是需要什么,维护 ...

  2. centos 6.5 升级内核 linux 3.12.17 (笔记 实测)

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Linux centos 2.6.32-431.el6.x86_64(Centos-6.5-x86_64-mi ...

  3. 更新日志(建议升级到2016.12.17) && 更新程序的方法

    更新程序的方法: 1,在控制面板里点击备份当前数据库文件到磁盘,把当天获取的信息从内存写到磁盘/存储卡.2,下载最新版的源码 wget -O "infopi.zip" " ...

  4. centos 6.5 升级内核 linux 3.12.17

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Linux centos 2.6.32-431.el6.x86_64(Centos-6.5-x86_64-mi ...

  5. docker安装升级linux内核(2.6.32->3.12.17)

    1.内核升级环境准备 #查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库:yum grouplist#一般是安装这两个软件包组,这样做会确定你拥有编译时所需的一切工具yum ...

  6. 调试大叔V2.1.0(2018.12.17)|http/s接口调试、数据分析程序员辅助开发神器

    2018.12.17 - 调试大叔 V2.1.0*升级http通讯协议版本,完美解决Set-Cookie引起的系列问题:*新增Content-Type编码格式参数,支持保存(解决模拟不同网站或手机请求 ...

  7. CentOS6.5内核升级到linux 3.12.17教程

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Linux centos 2.6.32-431.el6.x86_64(Centos-6.5-x86_64-mi ...

  8. Noip模拟55 2021.9.17(打表大胜利)

    T1 skip 普通$dp$很好打: $f[i]=max(f[j]-\sum_{k=1}^{K}k+a_i)$ 就是要注意边界问题很烦人. 1 #include<bits/stdc++.h> ...

  9. 2021.12.21 eleveni的刷题记录

    2021.12.21 eleveni的刷题记录 0. 有意思的题 P6701 [POI1997] Genotype https://www.luogu.com.cn/problem/P6701 状压优 ...

  10. 2021.12.19 eleveni的刷题记录

    2021.12.19 eleveni的刷题记录 0. 本次记录有意思的题 0.1 每个点恰好经过一次并且求最小时间 P2469 [SDOI2010]星际竞速 https://www.luogu.com ...

随机推荐

  1. win10安装node-red遇到的问题及解决方法

    1.安装失败 原因:没有管理员权限,需要用powershell(管理员)来安装 2.安装完成后运行失败 出现下面的情况 PS C:\WINDOWS\system32> node-rednode- ...

  2. 日常笔记-VS

    VS快捷键 按键 作用 CTRL+R,CTRL+W 以点显示空格 CTRL+L 删除当前行 CTRL+D 重复当前行 CTRL+K,D 格式化代码 CTRL+M 展开代码

  3. 为什么 C# 可能是最好的第一编程语言

    纵观神州大地,漫游中华互联网,我看到很多人关注为什么你应该开始学习JavaScript做前端,而对blazor这样的面向未来的框架有种莫名的瞧不起,或者为什么你应该学习Python作为你的第一门编程语 ...

  4. 前后端分离项目,配置问题导致后端session丢失问题

    今天遇到一个巨坑,后端写了获取验证码接口,以及验证验证码接口 获取验证码接口: /// <summary> /// 获取验证码 /// </summary> /// <r ...

  5. 一次spark任务提交参数的优化

    起因 新接触一个spark集群,明明集群资源(core,内存)还有剩余,但是提交的任务却申请不到资源. 分析 环境 spark 2.2.0 基于yarn集群 参数 spark任务提交参数中最重要的几个 ...

  6. 论文解读(CosFace)《CosFace: Large Margin Cosine Loss for Deep Face Recognition》

    论文信息 论文标题:CosFace: Large Margin Cosine Loss for Deep Face Recognition论文作者:H. Wang, Yitong Wang, Zhen ...

  7. Redis事件机制(未写完)

    Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 文件事件:Redis通过套接字与客户端连接,文件事件是服务器对套接字操作的抽象. 时间事件:Redis服务器中的一些操作需要给定的时间 ...

  8. Django笔记六之外键ForeignKey介绍

    这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法. 这是一种一对多的字段类型,表示两张表之间的关联关系. 本篇笔记的目录如下: on_delete ...

  9. python之sys库

    sys --- 系统相关的参数和函数 该模块提供了一些变量和函数.这些变量可能被解释器使用,也可能由解释器提供.这些函数会影响解释器.本模块总是可用的. sys.abiflags 在POSIX系统上, ...

  10. [操作系统]记一次未尽的三星 Galaxy A6s(SM-G6200)刷机过程

    给女王大人刷机,第一次刷机,很遗憾,遇到了三星的"锁三键"问题,没有搞成.记录一下这个过程所涉猎的一些刷机基本知识,不妨当作一次学习过程. 1 刷机过程 Step1 查看手机基本信 ...