各种细节问题层出不穷。。。
大致思路:先把开始时间按从小到大排列,找到结束最早的作为第一个节目,找到下一个大于该结束时间的开始时间并且结束时间最早的节目作为第二个,依次循环直到没有。
#include<iostream>
using namespace std;
struct Time //运用结构体使开始时间与结束时间统一便于管理
{
int s;
int e;
}t[100];
int main()
{
void paixu(Time t[100],int n);
int n;
while(cin>>n&&n!=0)
{
int i,m=1,e2=10000,e1=0,sum=0;
for(i=0;i<n;i++)
cin>>t[i].s>>t[i].e;
paixu(t,n);
while(m) //通过m的值的变化观察是否还有符合条件的时间段
{
m=0;
for(i=0;i<n;i++)
{
if(t[i].s>=e1&&t[i].e<e2) //e1保存上一个结束时间,e2为当前结束时间,寻找最小的e2
{
e2=t[i].e;
m=1;
}
}
e1=e2;
sum++;
e2=10000;
}
cout<<sum-1<<endl;
}
}
void paixu(Time t[100],int n)
{
int i,j;
Time temp;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
if(t[j].s>t[j+1].s)
{
temp=t[j];
t[j]=t[j+1];
t[j+1]=temp;
}
}
}
}
using namespace std;
struct Time //运用结构体使开始时间与结束时间统一便于管理
{
int s;
int e;
}t[100];
int main()
{
void paixu(Time t[100],int n);
int n;
while(cin>>n&&n!=0)
{
int i,m=1,e2=10000,e1=0,sum=0;
for(i=0;i<n;i++)
cin>>t[i].s>>t[i].e;
paixu(t,n);
while(m) //通过m的值的变化观察是否还有符合条件的时间段
{
m=0;
for(i=0;i<n;i++)
{
if(t[i].s>=e1&&t[i].e<e2) //e1保存上一个结束时间,e2为当前结束时间,寻找最小的e2
{
e2=t[i].e;
m=1;
}
}
e1=e2;
sum++;
e2=10000;
}
cout<<sum-1<<endl;
}
}
void paixu(Time t[100],int n)
{
int i,j;
Time temp;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
if(t[j].s>t[j+1].s)
{
temp=t[j];
t[j]=t[j+1];
t[j+1]=temp;
}
}
}
}