算法.docx
- 文档编号:28420225
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:65
- 大小:88.58KB
算法.docx
《算法.docx》由会员分享,可在线阅读,更多相关《算法.docx(65页珍藏版)》请在冰豆网上搜索。
算法
最优服务次序问题-1-
贪心选择策略-1-
多处最优服务次序问题:
-2-
最优服务次序-4-
快速排序-4-
最优服务次序-5-
/*回溯法-5-
0-1背包问题-7-
快速排序:
-8-
活动安排问题(贪心算法)-8-
最优装载问题(贪心)-10-
快速排序算法-11-
会场安排问题-12-
第六页1-1统计数字问题:
13
1-2字典序问题13
贪心算法会场安排问题14
贪心算法,磁盘文件最优存储问题14
贪心算法,多次最优服务次序问题15
贪心算法,最优服务次序问题15
0-1背包问题17
(1)动态规划法17
快速排序:
18
一填空题19
二填空题19
贪心算法-单源最短路径21
最优服务次序问题:
设有n个顾客同时等待同一项服务,顾客i需要的服务时间为ti,n>=i>=1,应如何安排这n个顾客的服务次序才能使平均等待时间达到最小。
平均等待时间是n个顾客等待服务时间的总和除以n。
贪心选择策略
假设原问题为T,而我们已经知道了某个最优服务系列,即最优解为A={t
(1),t
(2),….t(n))(其中t(i)为第i个用户需要的服务时间),则每个用户等待时间为:
T
(1)=t
(1);T
(2)=t
(1)十t
(2):
T(n)---t
(1)+t
(2)十t(3)+……t(n);
那么总等待时间,即最优值为:
TA=n。
t
(1)+(rrl)‘t
(2)十…+(n+l—i)‘t(i)+…2’t(n-1)+t(n)
由于平均等待时问是n个顾客等待时间的总和除以n,故本题实际上就是求使顾客等待时间的总和最小的服务次序。
本问题采用贪心算法求解,贪心策略如下:
对服务时间最的顾客先服务的贪心选择策略。
首先对需要服务时问最短的顾客进行服务,即做完第一次选择后,原问题T变成了需对n-1个顾客服务的新问题T’。
新问题和原问题相同,只是问题规模由n减小为n一1。
基于此种选择策略,对新问题T’,选择n-l顾客中选择服务时间最短的先进行服务.如此进行下去,直至所有服务都完成为止。
#include
#nclude
#include
#include
longn:
_1:
//顾客数n
Long*wait;N各自等待时间
voidinputDataO
{//输入数据n、wait
ifstreamfin;
fin.open(*input.txt’,los:
:
nocreate);
if(!
fin){
cout<<“FileOpenError!
"< return; } fin>>n; Wait==newlong[n]; for(1ongi=0;i { fin>>wait[i]; ) fin.close0; } voidShellSort(10ng*a) (//Shell排序,实现数据从小到大排序 longi,j,x.gap=n/2; while(gap>0){ for(i=gap;i j=i-gap; while(J>=0){ if(a[J]>a[j+gap]) { x=a[j];a[j]=a[j+gap];a[j+gap]=x; j=j-gap; } else{j一1;} } } gap=gap/2; } } 函数名: AveWait0 描述: 计算平均等待时问 参数: 各顾客等待时间 / doubleAveWait(10ng*a) { doubleave=0.0;’ ShellSort(a);. for(10ngi=0;i { ave+=1.0*(n-i)*a[i]; } ave/=n; returnave; ) voidoutputData(doubleout) (∥输出结果 ofstreamfout; fout.open("output.Txt"); fout< : fixed)< (2) < fout.close0; ) voidmain0 {//主调函数 inputData(); if(n! =-1)( doubleavewait=AveWait(wait); outputData(avewait): } } 试验结果: input.txt: 105612l991000234335599812 output.txt: ’ 532.00 多处最优服务次序问题: 设有n个顾客同时等待一项服务。 顾客i需要的服务时间为ti,1<=i<=n。 共有s处可以提供此项服务。 应如何安排n个顾客的服务次序才能使平均等待时间达到最小? 平均等待时间是n个顾客等待服务时间的总和除以n。 (输入的数据要求从文件input.txt中读到程序中,输出结果要求写入文件output.txt中。 ) 法一: #include #include usingnamespacestd; voidCountingSort(intt[],intn,intr[],inte,intq[]) { inti;//计数排序 for(i=0;i q[i]=0;//把数组元素全部赋初值为0 for(i=0;i q[t[i]]+=1;//判断累计相同等待时间的个数q[t[i]]=q[t[i]]+1; for(i=1;i q[i]+=q[i-1];//q[i]=q[i]+q[i-1] for(i=n;i>0;i--)//将顾客等待时间从小到大排列 { r[q[t[i-1]]-1]=t[i-1]; q[t[i-1]]-=1; } } voidmain() { inti=0,sum=0,n,max=0,u;//n为顾客个数 floatvt,p; ifstreamin("input.txt"); if(in.fail()) { cout<<"inputerror! "< exit (1);//抛出一个异常窗口 } ofstreamout("output.txt"); out.setf(ios: : fixed);//对输出设置精度 out.precision (2); in>>n; //new是给指针r分配n长度的空间,设置动态数组r,m,两个数组大小相同 int*r=newint[n]; int*t=newint[n]; for(i=0;i in>>t[i];//从文本给等待时间t[i]数组赋值 for(i=0;i { if(max max=t[i];//找出最大的等待时间 } u=max;//u为所有顾客中最长的等待时间 int*q=newint[u+1];//动态数组用于计数排序,减少排序时间 CountingSort(t,n,r,u+1,q);//调用CountingSort()函数 for(i=0;i { sum+=r[i]*(n-i); } //文件尾: p=(float)sum;//顾客等待服务时间的总和sum转换成浮点数赋给p vt=p/n;//计算平均等待时间 out< } 法二: #include #include #include usingnamespacestd; ifstreamin("input.txt"); ofstreamout("output.txt"); intMax(inta[],intn) { intpos=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)