各位大神们。。。。拜托啦。。。。。
为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;}