题目如下:
深圳大学长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0 , 1 , 2 , ... , L都种有一棵树。由于马路上有一些区域要用来建长椅,需要移走这些区域中的树。这些区域用它们在数轴上的起始点和终止点表示,已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。
要求计算把这些区域中的树(包括区域端点处的两棵树)移走后,马路上还有多少棵树。
输入(两行)
第一行,有两个整数,分别表示马路的长度L和区域的数目m(L<=10000)
接下来m行,每行两个整数i , f表示一个区域的起始点和终止点的坐标
输出(一行)
包含一个整数,表示马路上剩余的树木数量
输入样例 1
150 3
0 10
20 55
65 70
输出样例 1
98
思路:
设一个总长,两个数组,(数组)一个记录起点,一个记录终点,即用两个数组表示区域;待去掉重合部分后,用总长减去各区域。
注:解法中输入时前一项为数组项数n,后一项为长度L。与题目要求相反。
代码如下:
#include<stdio.h>
int main(){
int a[1000]; //先设个1000位,反正人也打不了这么多项
int b[1000];
int i;
int n; //此为区域个数
int L; //此为长度
scanf("%d %d",&n,&L);
L++; //若终点为150,则有151棵树
for(i=0;i<n;i++){
scanf("%d %d",&a[i],&b[i]); //动态赋值
}
//难点在于重复区域的合并,我这里用逐一比较找出最大的范围(如果有重合),再令其余值为0,避免多减
int k;
int j;
for(j=0;j<n;j++){
for(k=j+1;k<n;k++){ //双重循环用于逐一比较范围
if(a[j]<=b[k]&&b[j]>=a[k]){ //判断重合的条件
if(a[j]>a[k]){
a[j]=a[k]; //合并与赋值(0)
a[k]=0;
}
else a[k]=0;
if(b[j]<b[k]){
b[j]=b[k];
b[k]=0;
}
else b[k]=0;
}
}
}
int m;
int x;
for(m=0;m<n;m++){
if(a[m]==0&&b[m]==0){ //如果这一项的a[],b[]为0,要区别处理
x=0;
}
else x=b[m]-a[m]+1; //例如区域[3,4]中应该有4-3+1个数
L-=x;
}
printf("%d",L); //最后输出
return 0;
}
注:解法中输入时前一项为数组项数n,后一项为长度L。与题目要求相反。
匆匆写就,难免有误,还请多多指正。