[关闭]
@rg070836rg 2019-05-11T21:44:05.000000Z 字数 2491 阅读 1941

算法概论实验九 贪心法

算法概论实验

  1. 实验九
  2. 实验目的与要求:
  3. 1 掌握贪心法的基本思想和设计方法。
  4. 1.区间划分问题
  5. 【问题描述】
  6. 给定一组报告,其中的每个报告设置了一个开始时间si和结束时间fi。设计与实现一个算法,对这组报告分配最少数量的教室,使得这些报告能无冲突的举行。
  7. 2.最小延迟调度问题
  8. 【问题描述】
  9. 假定有一单个的资源在一个时刻只能处理一个任务。现给定一组任务,其中的每个任务i包含一个持续时间ti和截止时间di。设计与实现一个算法,对这组任务给出一个最优调度方案,使其对所有任务的最大延迟最小化。

1.区间划分问题

  1. #include<iostream>
  2. using namespace std;
  3. #define N 100
  4. struct Report
  5. {
  6. int num;//报告编号
  7. int begin;//开始时间
  8. int end;//结束时间
  9. bool flag;//是否已分配教室
  10. int classroom;//教室号
  11. };
  12. void QuickSort(Report* rep,int f,int t)//一开始将所有报告按结束时间排序
  13. {
  14. if(f<t)
  15. {
  16. int i=f-1,j=f;
  17. Report r=rep[t];
  18. while(j<t)
  19. {
  20. if(rep[j].end<=r.end)
  21. {
  22. i++;
  23. Report tmp=rep[i];
  24. rep[i]=rep[j];
  25. rep[j]=tmp;
  26. }
  27. j++;
  28. }
  29. Report tmp1=rep[t];
  30. rep[t]=rep[i+1];
  31. rep[i+1]=tmp1;
  32. QuickSort(rep,f,i);
  33. QuickSort(rep,i+2,t);
  34. }
  35. }
  36. int select_room(Report *rep,int *time,int n)
  37. {
  38. //第一个报告分给第一个教室
  39. int i=1,j=1;//i报告,j教室
  40. int sumRoom=1;
  41. int sumRep=1;//教室已分配的报告数
  42. time[1]=rep[0].end;
  43. rep[0].classroom=1;
  44. for(i=1;i<n;i++)
  45. {
  46. for(j=1;j<=sumRoom;j++)
  47. {
  48. if((rep[i].begin>=time[j])&&(!rep[i].flag))
  49. {
  50. rep[i].classroom=j;
  51. rep[i].flag=true;
  52. time[j]=rep[i].end;
  53. sumRep++;
  54. }
  55. }
  56. if(sumRep<n&&i==n-1)//报告没有分配完
  57. {
  58. i=0;
  59. sumRoom++;
  60. }
  61. }
  62. return sumRoom;
  63. }
  64. int main()
  65. {
  66. int n;
  67. Report rep[N];
  68. int time[N];//每个教室最后一个报告的结束时间
  69. cout<<"请输入报告数量:"<<endl;
  70. cin>>n;
  71. int i;
  72. for(i=0;i<n;i++)
  73. {
  74. //初始化
  75. time[i+1]=0;//time[1]~time[10]
  76. rep[i].num=i+1;//编号1~10
  77. rep[i].flag=false;
  78. rep[i].classroom=0;
  79. cout<<"报告"<<i+1<<"开始时间:";
  80. cin>>rep[i].begin;
  81. cout<<"报告"<<i+1<<"结束时间:";
  82. cin>>rep[i].end;
  83. }
  84. QuickSort(rep,0,n-1);
  85. int roomNum=select_room(rep,time,n);
  86. cout<<"所用教室总数为:"<<roomNum<<endl;
  87. for(i=0;i<n;i++)
  88. {
  89. cout<<"活动"<<rep[i].num<<"在教室"<<rep[i].classroom<<"中"<<endl;
  90. }
  91. system("pause");
  92. return 0;
  93. }

2.最小延迟调度问题

  1. #include<iostream>
  2. using namespace std;
  3. #define N 100
  4. struct Mission
  5. {
  6. int num;
  7. int last;
  8. int end;
  9. };
  10. void QuickSort(Mission *mi,int f,int t)
  11. {
  12. if(f<t)
  13. {
  14. int i=f-1,j=f;
  15. Mission m=mi[t];
  16. while(j<t)
  17. {
  18. if(mi[j].end<=m.end)
  19. {
  20. i++;
  21. Mission tmp=mi[i];
  22. mi[i]=mi[j];
  23. mi[j]=tmp;
  24. }
  25. j++;
  26. }
  27. Mission tmp1=mi[t];
  28. mi[t]=mi[i+1];
  29. mi[i+1]=tmp1;
  30. QuickSort(mi,f,i);
  31. QuickSort(mi,i+2,t);
  32. }
  33. }
  34. int main()
  35. {
  36. int n;
  37. cout<<"请输入任务总数:"<<endl;
  38. cin>>n;
  39. Mission mi[N];//Mission[0]~Mission[n-1]
  40. int start[N+1];//排好序的任务的开始时间,start[1]~start[n]
  41. int i;
  42. for(i=0;i<n;i++)
  43. {
  44. mi[i].num=i+1;
  45. cout<<"任务"<<i+1<<"的持续时间为:";
  46. cin>>mi[i].last;
  47. cout<<"任务"<<i+1<<"的截止时间为:";
  48. cin>>mi[i].end;
  49. }
  50. QuickSort(mi,0,n-1);
  51. int delay=0;
  52. start[1]=0;
  53. if(start[1]+mi[0].last>mi[0].end)
  54. {
  55. delay+=start[1]+mi[0].last-mi[0].end;//如果开始时间+持续时间>截止时间,累计延迟
  56. }
  57. for(i=1;i<n;i++)
  58. {
  59. start[i+1]=start[i]+mi[i-1].last;
  60. if(start[i+1]+mi[i].last>mi[i].end)
  61. {
  62. delay+=start[i+1]+mi[i].last-mi[i].end;
  63. }
  64. }
  65. cout<<"延迟最小为:"<<delay<<endl;
  66. for(i=0;i<n;i++)
  67. {
  68. cout<<"任务"<<mi[i].num<<"的执行时间:["<<start[i+1]<<","<<mi[i].last+start[i+1]<<"]"<<endl;
  69. }
  70. system("pause");
  71. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注