Problem: [Usaco2015 Dec]Fence Painting

Problem: [Usaco2015 Dec]Fence Painting

Time Limit: 1 Sec Memory Limit: 128 MB

Description

农夫约翰决定了近日将重新油漆略显破旧的围栏,而可爱的奶牛贝茜也主动提出要帮助他。可是,虽然贝茜工作地
十分卖力,可她误解了约翰农夫给出的指示。我们现在假设围栏是一条数轴,约翰农夫自己油漆x=a到x=b这之间的
区域,举个例子,如果a=3及b=5,那么约翰农夫油漆的长度就是2。奶牛贝茜没有理解好他的话,油漆了x=c到x=d
这之间的区域,而这一区域很可能就与约翰农夫油漆的区域重叠了。现在请你算出被漆过的围栏的长度。

Input

输入的第一行包含整数a和b,用空格分隔(a<b)
输入的第二行包含整数c和d,用空格分隔(c<d)
数值a,b,c和d都在区间0…100

Output

请算出被漆过的围栏的长度。

Sample Input

7 10
4 8

Sample Output

6
HINT
贝茜和约翰刷过的区间为[4,10]长度为6

方法一
判断各种情况,一个一个处理
空间复杂度和时间复杂度都较小,但难以判断各种情况,易出错
代码如下

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    if(a>=d||b<=c){
        cout<<b-a+d-c;
    }
    else if(c>=a&&d<=b){
        cout<<b-a;
    }
    else if(a>=c&&b<=d){
        cout<<d-c;
    }
    else if(d>=a&&c<=a){
        cout<<b-c;
    }
    else if(c<=b&&d>=b){
        cout<<d-a;
    }
    return 0;
}

方法二
用一个bool数组当篱笆,true为涂过,false为没涂过
简单易懂,但空间复杂度和时间复杂度都较大
代码如下

#include<stdio.h>
int r[101];
int main() {
	int a,b,c,d,ans=0;
	scanf("%d %d %d %d",&a,&b,&c,&d);
	for(int i=a; i<b; i++)
		r[i]=1;
	for(int i=c; i<d; i++)
		r[i]=1;
	for(int i=0; i<=100; i++)
		if(r[i])
			ans++;
	printf("%d",ans);
}
posted @ 2019-01-29 21:12  ZhaoChongyan  阅读(106)  评论(0编辑  收藏  举报