算法设计中的会场安排问题

本文介绍了一个会议调度算法,通过按会议结束时间排序并采用贪心策略选择尽可能多的不冲突会议,实现有效的时间资源利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值