【日常学习】【其他算法】codevs3371 刮油漆题解

来源:互联网 发布:淘宝怎么修改折扣价 编辑:程序博客网 时间:2024/05/17 01:45

题目描述 Description

小J有一把尺子。一天MPS闲得无聊,拿了一桶油漆,用刷子在上面刷了N下,刷第i次有一个正整数范围(ai,bi),表示从尺子的刻度ai刷到刻度bi。此时ai到bi这个区间里的油漆层数+1。

为了去掉这些油漆,小J找来了一把刀,每次可以从尺子的一个整数刻度刮到另一个整数刻度。每刮一刀都有一个力度,如力度为3时可以一次刮掉3层油漆。但不能损坏尺子。比如有2层油漆的地方就不能用力度3来刮。

小J想知道最少要刮多少次。

输入描述 Input Description

第一行,一个整数N

第2...N+1行,第i+1行两个整数ai,bi。

输出描述 Output Description

一行,最少刮多少次。

样例输入 Sample Input

3

1 4

2 5

1 5

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

【样例解释】

刮2刀,第一次刮区间(1,5),力度为2,第一次刮区间(2,4),力度为1。

【数据范围】

40%的数据N<=2000

100%的数据N,ai,bi<=10^5

乍一看似乎有些复杂,只是好像和“积木大赛”有点像?不同点在于积木大赛只能动一层,而这个可移动很多层。只要是连续区间即可。

于是按照积木大赛的算法改了一下,但是失败了···

但是和正确的算法也有异曲同工之妙 

事实上,我们只需要在读入每个区间时【对区间的左端点a[k]+1,右端点a[k]-1,最后统计是正数多还是负数多即可】

为什么这样可以呢?我们举一个例子:

第一个区间【1,3】

第二个区间【1,5】

那么图像是这样的

XXX

XXXXX

对应数字为

1 0 -1 0 -1

结合积木大赛的思路,由于负数有两个,有两处下降,那么至少两次才能刮完。更多情况,可以以此深入理解。


code


——泪随流水急,愁逐野云飞




0 0
原创粉丝点击