读书人

诸位大神们。拜托啦。

发布时间: 2012-09-18 16:21:42 作者: rapoo

各位大神们。。。。拜托啦。。。。。
为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置。数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

 

输入描述

输入的第一行有两个整数L(1 ≤ L ≤ 10000)和M(1 ≤ M ≤ 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

输出描述

输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入

500 3
150 300
100 200
470 471
样例输出

298

[解决办法]

C/C++ code
#include<iostream>using namespace std;int ans,L,M,line[10001];int main(){      cin>>L>>M;int l,r,rp=-1,flag=1;      //rp is right point of a interval,we use rp to maintain a union set of all intervals.      for(int i=1;i<=M;i++){            cin>>l>>r;            line[l]=r;      }//input data.      for(int i=0;i<=L;i++){            if(line[i]){                  flag=0;                  rp=max(line[i],rp);            }            if(i>rp)flag=1;            if(flag)ans++;      }//maintained rp and calculated answer.      cout<<ans<<endl;      return 0;}
[解决办法]
这个问题应该可以做到m * log(m),对区域按照起点排个序,用O(m)遍历一下,把区域合并一下,第二遍遍历一下,统计有多少棵树。
[解决办法]
#include<iostream>
using namespace std;
int a[10000],b[101];

void kuaipai(int*b,int q,int p){
if(q>=p )
return ;
int i=q,j=q,r=b[p];
while( j<p ){
if(b[j]<b[p] )
swap(b[i++],b[j]);
j++;
}
swap(b[p],b[i]);
kuaipai(b,q,i-1);
kuaipai(b,i+1,p);
}
int main(){
int l,m,n;
cin>>l>>m;
for( int i=0;i<m;i++) {cin>>b[i];cin>>a[b[i]];}
kuaipai(b,0,m-1);
n=0;
for(int i=0 ;b[i];i++ ){
int k=b[i];
while(a[b[i]]>b[i+1]&&b[i+1] )
i++;
n+=( a[b[i]]-k) ;
}
cout<<l-n-1<<endl;
}

T(n)=m*lg(m)
[解决办法]
C/C++ code
#include<iostream>using namespace std;int a[10000],b[101];void kuaipai(int*b,int q,int p){    if(q>=p )        return ;    int i=q,j=q,r=b[p];    while(  j<p ){        if(b[j]<b[p] )            swap(b[i++],b[j]);        j++;    }    swap(b[p],b[i]);    kuaipai(b,q,i-1);    kuaipai(b,i+1,p);}int main(){    int l,m,n;    cin>>l>>m;    for( int i=0;i<m;i++) {cin>>b[i];cin>>a[b[i]];}    kuaipai(b,0,m-1);    n=0;    for(int i=0 ;b[i];i++ ){        int k=b[i];        while(a[b[i]]>b[i+1]&&b[i+1] )            i++;        n+=( a[b[i]]-k) ;    }    cout<<l-n-1<<endl;} 

读书人网 >软件架构设计

热点推荐