ProDeveloperTutorial.com

教程和编程解决方案
菜单
  • Shell脚本
  • 系统设计
  • Linux系统编程
  • 4g LTE
  • 编码问题
  • C
  • C ++
  • DSA
  • GIT

活动选择问题

前开发者教程 2019年8月19日

在本章中,我们将通过示例和使用方法学习如何解决活动选择问题 贪心法.

问题陈述:

您将获得活动列表以及开始和结束时间。您的工作是查找该机器可以执行的最大活动数。请注意,机器一次只能执行一项任务。

这些活动应无冲突。这意味着,新活动的开始时间应大于或等于上一个活动的结束时间。

 

例如:

 

以下是活动的开始和结束时间列表;

 

 活动选择问题

 

现在可以选择活动a1,但是不能选择a2,因为a2的开始时间小于a1的结束时间。因此,您跳过a2并移至a3。

由于a3的开始时间大于a1的时间,因此您将选择它。但是是最佳解决方案吗?没有

因为,如果选择a2,则为a3。然后,您将完成更多工作。

 

那么如何解决这个问题呢?

我们可以通过解决 贪心法。我们按照以下3个步骤进行操作,以找到解决方案。

步骤1:根据结束时间按升序对活动进行排序。

步骤2:选择该活动

步骤3:检查新活动的开始时间是否大于或等于上一个活动的结束时间,然后选择它。重复步骤2和3,直到检查了所有活动。

 

请看下表:

 

 活动选择问题

 

现在根据结束时间对活动进行排序

 

 活动选择问题

 

现在选择a1并将其放在结果表中

 活动选择问题

 

现在,a2开始时间小于a1结束时间。因此跳过a2。

 

现在,a6开始时间大于a1结束时间。因此,选择该活动。

 

 活动选择问题

 

同样,a4开始时间小于a6结束时间。因此,将其丢弃。

 

a3开始时间等于a6结束时间。因此,选择该活动。

 

 活动选择问题

 

a5开始时间等于a3结束时间。因此选择它。

 

 活动选择问题

 

因此,最终结果。

C ++中活动选择问题的解决方案

#include <iostream>

using namespace std;

struct Activity 
{
  char id[10];
  int start;
  int finish;
};

void activitySelection(Activity activities[], int n) 
{
  int i, j;

  Activity temp;

  // sort activities in ascending order according to their ascending order
  for(i = 1; i < n; i++) 
  {
    for(j = 0; j < n - 1; j++)
    {
      if(activities[j].finish > activities[j+1].finish) 
      {
        temp = activities[j];
        activities[j] = activities[j+1];
        activities[j+1] = temp;
      }
    }
  }

  cout<<"Activities printed according to sorted order of their finishing time."<<endl;
  cout<<"Activity Start Finish"<<endl;

  for(i = 0; i < n; i++) 
  {
    cout<<activities[i].id<<"       "<< activities[i].start<<"       " <<activities[i].finish<<endl;
  }

  cout<<"Final Result"<<endl;
  cout<< "Activity  Start Finish"<<endl;
  cout<< activities[0].id<<"       " << activities[0].start<<"       " <<activities[0].finish<<endl;


  //check and select the next activity whose start time is greater than or equal to the finishing period of previous 
  //activity
  i = 0;
  for(j = 1; j < n; j++) 
  {
    if(activities[j].start >= activities[i].finish) 
    {
      cout<<activities[j].id<<"       "<< activities[j].start<<"       "<< activities[j].finish<<endl;
      i = j;
    }
  }
}
int main(void) {

  Activity activities[8] = 
  {
    {"a1", 2, 3},
    {"a2", 1, 4},
    {"a3", 8, 10},
    {"a4", 6, 9},
    {"a5", 10, 15},
    {"a6", 5, 8},
  };
  int total_activity = 6;

  activitySelection(activities, total_activity);

  return 0;
}

输出:

Activities printed according to sorted order of their finishing time.
Activity Start Finish
a1       2       3
a2       1       4
a6       5       8
a4       6       9
a3       8       10
a5       10       15
Final Result
Activity  Start Finish
a1       2       3
a6       5       8
a3       8       10
a5       10       15

进一步阅读:

AJ关于DS和算法的权威指南。单击此处以学习算法和数据结构教程的完整列表。 85多个章节可供学习。

 

该网站上可用的教程列表:

C编程20+章C ++编程80+章
100多个编码问题数据结构和算法85+章
系统设计20+章Shell脚本编写12章
4g LTE 60+章节最常见的编码问题
5G NR 50+章Linux系统编程20+章
分享
电子邮件
鸣叫
领英
Reddit
绊倒
Pinterest的
上一篇文章
下一篇

关于作者

前开发者教程

每天我们都会讨论竞争性编程问题,请加入我们的网站:   电报频道

ProDeveloperTutorial.com

教程和编程解决方案
版权© 2020 ProDeveloperTutorial.com
从以下课程获得热门课程: 教育性的
<param id="j28C7aB" class="j8QlBNQ"><keygen class="nrpcuNr"><applet id="bviOFbF"><samp id="F2glgXE" class="Fyb8wRu"></samp></applet></keygen></param>
    <xmp class="rFUOHde"><textarea id="xlzLXYZ"><del id="e5TAkI3" class="eyHAt3D"></del></textarea>

    1. <optgroup class="wbDE9Hg"></optgroup>
        <select id="u1fyiVw" class="ufazgI0"><table id="phkWZLa" class="pCrZU3p"></table></select>