#include <iostream>
using namespace std;
using namespace std;
class Arrange
{
public:
//用于初始化会场的开始时间
void initStart(int Start[],int n)
{
for(int i=0; i<n; i++)
{
cin>>Start[i];
}
}
//用于初始化会场的结束时间
void initFinish(int Finish[],int n)
{
for(int i=0; i<n; i++)
{
cin>>Finish[i];
}
}
//用于初始化会场的编号
void initNum(int num[],int n)
{
for(int i=0;i<n;i++)
{
cin>>num[i];
}
}
//算法能够成功的关键,就是对这n次会议进行按结束时间的先后进行排序
//这个地方的排序是此算法能够成功 的关键
void Sort(int n,int Start[],int Finish[],int Num[])
{
int temp;
for(int i=0;i<n;i++)
{
for(int j=i;j<n-1;j++)
{
if(Finish[j]>Finish[j+1])
{
//交换结束时间
temp=Finish[j];
Finish[j]=Finish[j+1];
Finish[j+1]=temp;
//为了会场开始时间和结束时间的对应,交换开始时间
temp=Start[j];
Start[j]=Start[j+1];
Start[j+1]=temp;
//每一个会场其实都有一个编号,为了后来的会场和最初的编号对应,所以此处
//应该调整的他们的所对应的编号
temp = Num[j];
Num[j] = Num[j+1];
Num[j+1] = temp;
}
}
}
}
void GreedySelector(int n,int Start[],int Finish[],bool A[])
{
//对于已经按结束时间排好序的会场来说,第一个数组元素
//就代表了最早结束的,这也就是我们所贪婪地
A[0] =true;
int j=0;
for(int i=1;i<n;i++)
{
//对于某个会场的开始时间大于结束时间的的话,那么我们就判定他是和前一个会议是相容的
if(Start[i]>=Finish[j])
{
A[i]=true;
j=i;
}else
{
A[i]=false;
}
}
}
};
int main()
{
int n;
//用于记录那一场会议被选中,如果选中,那么他的记录只则为true
//后面再便利输出会场编号的时候,需要根据他的编号来找到对应的会场
bool A[50];
//用于保存会议的开始时间
int Start[50];
//用于保存会议的结束时间
int Finish[50];
//用于保存会场的编号,因为每一场会议都有一个编号,那么这个地方可以是整数
// 类型也可以是其他的数据类型
int Num[50];
Arrange a;
cout<<"请输入总共要安排的会议次数n!\n";
cin>>n;
//初始化会场编号
cout<<"请输入会场的编号!\n";
a.initNum(Num,n);
cout<<"请输入各场会议的开始时间!\n";
//初始化会场结束时间
a.initStart(Start,n);
cout<<"请输入"<<n<<"场会议的结束时间e 注意开始时间和结束时间的对应关系!\n";
a.initFinish(Finish,n);
a.Sort(n,Start,Finish,Num);
a.GreedySelector(n,Start,Finish,A);
cout<<"被选中的会场的编号是:\n";
for(int i=0;i<n;i++)
{
if(A[i])
{
cout<<Num[i]<<" ";
}
}
return 0;
using namespace std;
using namespace std;
class Arrange
{
public:
//用于初始化会场的开始时间
void initStart(int Start[],int n)
{
for(int i=0; i<n; i++)
{
cin>>Start[i];
}
}
//用于初始化会场的结束时间
void initFinish(int Finish[],int n)
{
for(int i=0; i<n; i++)
{
cin>>Finish[i];
}
}
//用于初始化会场的编号
void initNum(int num[],int n)
{
for(int i=0;i<n;i++)
{
cin>>num[i];
}
}
//算法能够成功的关键,就是对这n次会议进行按结束时间的先后进行排序
//这个地方的排序是此算法能够成功 的关键
void Sort(int n,int Start[],int Finish[],int Num[])
{
int temp;
for(int i=0;i<n;i++)
{
for(int j=i;j<n-1;j++)
{
if(Finish[j]>Finish[j+1])
{
//交换结束时间
temp=Finish[j];
Finish[j]=Finish[j+1];
Finish[j+1]=temp;
//为了会场开始时间和结束时间的对应,交换开始时间
temp=Start[j];
Start[j]=Start[j+1];
Start[j+1]=temp;
//每一个会场其实都有一个编号,为了后来的会场和最初的编号对应,所以此处
//应该调整的他们的所对应的编号
temp = Num[j];
Num[j] = Num[j+1];
Num[j+1] = temp;
}
}
}
}
void GreedySelector(int n,int Start[],int Finish[],bool A[])
{
//对于已经按结束时间排好序的会场来说,第一个数组元素
//就代表了最早结束的,这也就是我们所贪婪地
A[0] =true;
int j=0;
for(int i=1;i<n;i++)
{
//对于某个会场的开始时间大于结束时间的的话,那么我们就判定他是和前一个会议是相容的
if(Start[i]>=Finish[j])
{
A[i]=true;
j=i;
}else
{
A[i]=false;
}
}
}
};
int main()
{
int n;
//用于记录那一场会议被选中,如果选中,那么他的记录只则为true
//后面再便利输出会场编号的时候,需要根据他的编号来找到对应的会场
bool A[50];
//用于保存会议的开始时间
int Start[50];
//用于保存会议的结束时间
int Finish[50];
//用于保存会场的编号,因为每一场会议都有一个编号,那么这个地方可以是整数
// 类型也可以是其他的数据类型
int Num[50];
Arrange a;
cout<<"请输入总共要安排的会议次数n!\n";
cin>>n;
//初始化会场编号
cout<<"请输入会场的编号!\n";
a.initNum(Num,n);
cout<<"请输入各场会议的开始时间!\n";
//初始化会场结束时间
a.initStart(Start,n);
cout<<"请输入"<<n<<"场会议的结束时间e 注意开始时间和结束时间的对应关系!\n";
a.initFinish(Finish,n);
a.Sort(n,Start,Finish,Num);
a.GreedySelector(n,Start,Finish,A);
cout<<"被选中的会场的编号是:\n";
for(int i=0;i<n;i++)
{
if(A[i])
{
cout<<Num[i]<<" ";
}
}
return 0;
}