每日一题——围栏刷漆

144 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

题目描述

几经酷暑严冬,农夫约翰的围栏已经破旧不堪。

他觉得是时候重新粉刷围栏了。

他最喜欢的奶牛贝茜也会帮助他完成这一工作。

不幸的是,尽管贝茜非常擅长刷漆,但她并不擅长理解农夫约翰的指示。

如果我们将围栏看作一条一维数轴,约翰会负责粉刷 x=a 到 x=b之间的围栏。

例如,如果 a=3,b=5,则约翰将粉刷的围栏长度为 2。

贝茜误解了约翰的指示,因此,她将粉刷 x=c 到 x=d 之间的围栏。

这段区域可能会与约翰需要粉刷的区域部分或完全重叠。

现在,请你确定被粉刷围栏的总长度。

输入格式

第一行包含两个整数 a,b。

第二行包含两个整数 c,d。

输出格式

输出被粉刷围栏的总长度。

数据范围

0≤a<b≤100, 0≤c<d≤100

输入样例:

7 10
4 8

输出样例:

6

样例解释

从 x=4 到 x=10 的总计长度为 6 的围栏被粉刷。

思路

本题主要考察区间求和的问题。这个问题我们主要可以借助公式两个区间的交集=max(0,(min(b,d) - max(a,c))),对于两个区间(a,b)和(c,d)来说

image.png

有了这个公式我们就可以很快的解决此题,只需要判断二者有没有交集,有的话就取整个区间的长度即可,如果没有则分开求两区间的长度,最后相加即可求解出我们的答案。

注意:时间复杂度O(n)

代码

#include <iostream>
#include <cstring>using namespace std;
​
const int N = 110;
​
int q[N];
​
int main()
{
    int a, b;
    int c, d;
    cin >> a >> b >> c >> d;
    int result = 0;
    int mix = max(0, min(b, d) - max(a, c));
    if(mix) result = max(b,d) - min(a,c);
    else result = (b - a) + (d - c);
    
    cout << result << endl;
    return 0;
}