首页 > 其他 > 详细

# 差分法

时间:2018-09-16 15:00:24      阅读:149      评论:0      收藏:0      [点我收藏+]

$\color{red}\text{差分法是啥?}$

我们还是结合题目来理解吧:P1083 借教室

技术分享图片

如果浓缩一下题目的意思,如下:

有m个人,每个人要借di个教室,总共借si-ti天,现在要你尽可能地满足每个人的教室需求量。

按照常规思路,我们可能会建立一个结构体变量a数组,然后把所有信息都输进去。再用一个day数组记录每天有多少个教室被借出去,然后用一个for循环m次,每次一个for循环(ti-si)次,每次把day[i]++即第i天的教室数加一。

这样子看起来是很简单粗暴,但是这样的方法时间复杂度是n^2。我们还要加上输入的时间,还要考虑其他诸多因素,时间肯定会爆掉。

那么,有没有一种方法,可以使时间变得更短呢?

答案是,有。这就是今天我要介绍的差分法。

首先,我们建立几个数组:day[1000]、borrow[1000];其中day表示当天是否有教室借阅情况,初始值全都赋值为0.然后borrow我们等会再讲。如下图:

技术分享图片

然后,我们输入数据:

10 3
1 1 5
2 4 6
4 3 7

先处理第一组数据:3 1 5。表示3个教室从第1天借到第5天

我们在borrow表格里作如下处理:borrow[1]++,borrow[5+1]--;

技术分享图片

我们再在下面建立一个数组:res,来演示实际的day。

我们会发现:res[i]+borrow[i+1]=res[i+1]

技术分享图片

通过这种方法,我们就不必再去进行si-ti的循环,对每一天进行加法,我们只需要把这个天的头和尾做一个标记即可。

同理:如果di=2,我们只需要在borrow[4]+=2和borrow[6+1]-=2即可。
技术分享图片

# 差分法

原文:https://www.cnblogs.com/WonderfulZealousTom/p/9655736.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!