首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

各位大神们。拜托啦。解决办法

2013-01-25 
各位大神们。。。。拜托啦。。。。。为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个

各位大神们。。。。拜托啦。。。。。
为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
[解决办法]


#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)
[解决办法]
#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)

热点排行