給定一些線段,求這些線段所覆蓋的長度,注意,重疊的部分只能算一次。
輸入說明 :
第一列有一個正整數 n:
代表共有 n 組測試案例。
接下來每一組測試案例的第一列是一個整數 m
表示此測試案例有m個線段,
接著的m列每一列是一個線段的兩端點,
每一個端點是一個整數介於0~60000之間,
端點之間以一個空格區隔,線段個數不超過 5000。
輸出說明 :
針對每一組測試案例,輸出其覆蓋的長度,每組測試案例輸出一列。
不合法的輸入則輸出E
Input:
2 (共有2組次是案例)
2 (此組測試案例有2個線段)
0 1
2 3
3 (此組測試案例有3個線段)
0 20
10 30
40 50
Input:
3
3
10 111
150 3450
160 180
2
100 180
150 3333
1
150 150
Input:
1
2
150 320
160 190
Output:
170
#include <stdio.h>
int lineadd(int x1,int y1,int x2,int y2,int z,int control){
if((x2>y2|| x1>y1) && (x1>=x2||x1>=y2)){
return 100;
}
if(control==0){
z=y1-x1;
}
if(y1>=x2&&y1<y2){
z=z+y2-y1;
}
else if(y1<x2&&y1<y2){
z=z+y2-x2;
}
return z;
}
int main(){
int n,m,z=0,control=0,error=1,z1=0;
int x1=0,y1=0,x2=0,y2=0;
int i=0,j=0,k;
int a[300];
scanf("%d",&n);
k=n;
if(n>0){
for(i=n;i>0;i--){
scanf("%d",&m);
if( m<=5000 && m>0){
scanf("%d %d",&x1,&y1);
if(x1>=0 && x1<=60000 && y1>=0 && y1<=60000){
z1=y1-x1;
for(j=m;j>1;j--){
scanf("%d %d",&x2,&y2);
if(x2>=0 && x2<=60000 && y2>=0 && y2<=60000){
if(lineadd(x1,y1,x2,y2,z,control)!=100 && error){
z=lineadd(x1,y1,x2,y2,z,control);
}
else{
//printf("E\n");
//j=0;
error=0;
}
control=1;
x1=x2;
y1=y2;
}
else{
//printf("E\n");
//j=0;
error=0;
}
}
control=0;
if(m==1){
printf("%d\n",z1);
}
else if(error==1){
printf("%d\n",z);
}
else{
printf("E\n");
}
z=0;
error=1;
}
else{
//printf("E");
//j=0;
error=0;
}
}
else{
printf("E\n");
//i=0;
}
}
}
else
printf("E\n");
return 0;
}