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);
}