最优服务次序问题

问题描述: 设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti, 1≦i ≦n 。共有s处可以提供此服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小平均等待时间是n个顾客等待服务时间的总和除以n。

算法设计:对于给定的n个顾客需要的服务时间,计算最优服务次序。

数据输入:由文件input.txt给出输入数据。第一行是正整数n,表示有n个顾客。接下来的1行中,有n个正整数,表示n个顾客需要的服务时间。

结果输出:将计算的最小平均等待时间输出到文件output.txt中。

 输入文件示例                           输出文件示例input.txt                             output.txt10                                                                  56 12 1 99 1000 234 33 55 99 812          532.00

问题分析:假设原问题为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=T(1)+T(2)+T(3)+…+T(n)=n*t(1)+(n-1)*t(2)+…+(n+1-j)*t(i)+…+2*t(n-1)+t(n);由于平均等待时间是n个顾客等待时间的总和除以n,故本题实际上就是求使顾客等待时间的总和最小的服务次序。

贪心策略: 最短服务时间优先,先将服务时间排序,然后注意后面的等待服务时间既包括等待部分,也包括服务部分。对服务时间最短的顾客先服务的贪心选择策略,首先对需要服务时间最短的顾客进行服务,即做完第一次选择后,原问题T变成了需对n-1个顾客服务的新问 题T’。新问题和原问题相同,只是问题规模由n减小为n-1。基于此种选择策略,对新问题T’,选择n-1顾客中选择服务时间最短的先进行服务,如此进行 下去,直至所有服务都完成为止 。

算法实现: 采用最短服务时间优先的贪心策略。首先将每个顾客所需要的服务时间从小到大排序。然后申请2个数组: st[]是服务数组,st[j]为第j个队列上的某一个顾客的等待时间;su[]是求和数组,su[j]的值为第j个队列上所有顾客的等待时间。

算法复杂性分析 : 程序主要是花费在对各顾客所需服务时间的排序和贪心算法,即计算平均服务时间上面。其中,贪心算法部分只有一重循环影响时间复杂度,其时间复杂度为O(n):而排序算法的时间复杂度为O(nlogn)。因此,综合来看算法的时间复杂度为O(nlogn)。

代码实现:

#include<iostream>
#include <vector>
#include<algorithm>  using namespace std;
using std::vector;   double greedy(vector<int>x,int s){   vector<int>st(s+1,0);  vector<int>su(s+1,0);    int n=x.size();    sort(x.begin(),x.end());    int i=0,j=0;      while(i<n){  st[j]+=x[i];     su[j]+=st[j];     i++;  j++;     if(j==s)j=0;   }   double t=0;  for(i=0;i<s;i++)   t+=su[i];   t/=n;   return t;
}
int  main(){  int n;//等待服务的顾客人数    int s;//服务点的个数    int i;    int a;     int t;//平均服务时间    vector<int>x;     cout<<"请输入顾客的人数: "<<endl;    cin>>n;     cout<<"请输入服务点的个数: "<<endl;    cin>>s;     cout<<"请输入每个顾客需要服务的时间: "<<endl;   for(i=1;i<=n;i++){  cout<<"第"<<i<<"顾客:  "<<endl;   cin>>a;   x.push_back(a);   }   t=greedy(x, s);   cout<<"最小平均等待时间为: "<<t<<endl;
} 

运行结果

汽车加油问题

问题描述:一辆汽车加满油后,可行使nkm。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油才能使加油次数最少。并证明算法产生一个最优解。

算法设计:对于给定的n和k个加油站位置,计算最少加油次数。

数据输入:由文件inpput.txt给出输入数据。第1行有2个正整数n和k,表示汽车加满油后可行驶nkm,且旅途中有k个加油站。接下来的1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油。第k+1个加油站表示目的地。

结果输出:将计算的最少加油次数输出到文件output.txt.如果无法到达目的地,则输出”No Solution!”。

    输入文件示例                          输出文件示例input.txt                           output.txt7 7                                     41 2 3 4 5 6 6

问题分析: 有几种情况:设加油次数为k,每个加油站间距离为a[i];i=0,1,2,3……n

(1)始点到终点的距离小于n,则加油次数k=0。

(2)始点到终点的距离大于n。

 A  加油站间的距离相等,即a[i]=a[j]=L=N,则加油次数最少k=n;    B  加油站间的距离相等,即a[i]=a[j]=L>N,则不可能到达终点;   C 加油站间的距离相等,即a[i]=a[j]=L<N,则加油次数k=n/N(n%N==0)或k=[n/N]+1(n%N!=0); D  加油站间的距离不相等,即a[i]!=a[j],则加油次数k通过以下算法求解。

算法思路:汽车行驶过程中,应走到自己能走到并且离自己最远的那个加油站,在那个加油站加油后再按照同样的方法贪心。

算法实现:先检测各加油站之间的距离,若发现其中有一个距离大于汽车加满油能跑的距离,则输出no solution。否则,对加油站间的距离进行逐个扫描,尽量选择往远处走,不能走了就让num++,最终统计出来的num便是最少的加油站数。

算法复杂性分析 :想要知道在哪个加油站加油必须遍历所有的加油站,且不需要重复遍历,所以时间复杂度问O(n)。

代码实现:

/*汽车加油问题 先检测各加油站之间的距离,若发现其中有一个距离大于汽车加满油能跑的距离,则输出no solution否则,对加油站间的距离进行逐个扫描,尽量选择往远处走,不能走了就让num++,最终统计出来的num便是最少的加油站数 */ #include <stdio.h>        void greedy(int d[],int n,int k){ FILE *fp;    int num = 0;     for(int i = 0;i <= k;i++){     if(d[i] > n){     printf("no solution!其中有一个距离大于汽车加满油能跑的距离!\n");     return;     }     }     for(int i=0,s=0;i<=k;i++){     s += d[i];     if(s > n) {     num++;     s = d[i];     }     }     printf("最少加油次数为:%d\n",num);fp=fopen("output.txt","w");fprintf(fp,"%d",num);    }                  int main(){     int i,n,k;     int d[1000]; FILE *fp;fp=fopen("input.txt","r");fscanf(fp,"%d%d",&n,&k);printf("汽车加满油后可行驶: %d km\n旅途中加油站个数为: %d \n",n,k);    for(i=0;i<=k;i++)fscanf(fp,"%d",&d[i]);       greedy(d,n,k);fclose(fp);  return 0;      }    

文件input.txt的内容(运行程序前):

output.txt内容(运行程序后):

运行结果

最优服务次序问题 和 汽车加油问题相关推荐

  1. 算法分析与设计之多处最优服务次序问题2

    ¢ 设有n个顾客同时等待一项服务,顾客i需要的服务时间为ti,1≤i≤n,共有s处可以提供此项服务.应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以 ...

  2. 贪心算法--多处最优服务次序问题

    问题描述:        设有n 个顾客同时等待一项服务.每个顾客需要服务一定时间.共有s 处可以        提供此项服务.应如何安排n 个顾客的服务次序才能使平均等待时间达到最小?平均等待时   ...

  3. C语言会场安排问题贪心算法,贪心算法解决会场安排问题多处最优服务次序问题(含源代码).doc...

    贪心算法解决会场安排问题多处最优服务次序问题(含源代码) 西 安年月日-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动i都有一个要求使用该资源 ...

  4. 最优服务次序问题算法c语言,《算法分析与设计》最优服务次序问题的答案-20210414020541.docx-原创力文档...

    最优服务次序问题 设有n个顾客同时等待同一项服务.顾客i需要的服务时间为ti,1<=iv=n 应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间 是n个顾客等待服务时间的总和除 ...

  5. 【算法设计与分析】 最优服务次序问题

    算法课程展示 最优服务次序问题 简介: 青岛某高校,信安专业,算法课程第三次课堂展示 问题描述 设有n个顾客同时等待一项服务,顾客i需要服务的时间为t[i](1<= i <=n).应如何安 ...

  6. 最优服务次序问题-贪心算法

    1.最优服务次序问题 (1)问题描述: 设有n 个顾客同时等待一项服务.顾客i需要的服务时间为ti, 1<=i <= n .应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待 ...

  7. 7-8 最优服务次序问题 (10 分)

    一 :题目 设有n 个顾客同时等待一项服务.顾客i需要的服务时间为 t i ​ (1<=i<=n) .应如何安排n个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n 个顾客等待服 ...

  8. 算法学习系列(贪心算法)—多处最优服务次序问题

    问题描述: 设有n(1≤n≤100)个顾客同时等待一项服务.顾客i需要的服务时间为ti,1≤i≤n,共有s处提供此服务.应如何安排n个顾客的服务次序才能使平均等待时间达到最小.平均等待时间是n个顾客的 ...

  9. 算法分析与设计实验报告——实现汽车加油问题

    算法分析与设计实验报告--实现汽车加油问题 目录: 算法分析与设计实验报告--实现汽车加油问题 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与讨论 ...

最新文章

  1. vs2010快捷方式
  2. 用了 3 年 Apollo,最后我选择了 Nacos,原因不多说了
  3. top命令的笔记补充2--如何将top信息后台运行并写入log
  4. java 图形化库_java图形界面之图形化按钮
  5. 大神接棒,YOLOv4来了!
  6. 关系数据库理论:数据库的六大范式知识笔记
  7. idea 2个配置 实时编译 autowire注解错
  8. 三星Galaxy S11+电池谍照曝光:5000mAh超大容量 5G 不虚
  9. Android系统性能调优工具介绍
  10. nokia 3030 java 应用_诺基亚3030怎么样 :诺基亚3030测评【图解】
  11. c++做界面_一看就会做系列 SmartLink远程诊断发布需求指南简单版
  12. Mybatis动态标签基本使用
  13. java的类加载器体系结构和双亲委派机制
  14. stagefright_StageFright:Android操作系统中最易受攻击的错误
  15. javascript设计模式--设计原则
  16. matlab 四维等值面图,一个4列数组怎样画出三维等值面图
  17. MATLAB数字图像小系统
  18. 传统数据与大数据对比
  19. python画猫hellokitty_如何用铅笔画HelloKitty? 原来是这样的
  20. 从Antd 源码到自我实现之 Form表单

热门文章

  1. Qt-Q_OBJECT宏及控件提升导致的类重定义问题
  2. 你们还不了解YUM的使用?那就看看这篇文章把~
  3. Android P update_engine分析(三) --boot_control的操作
  4. 在字符串中输入回车换行或其它特殊字符
  5. linkedin 分享_如何将您的LinkedIn个人资料添加到WordPress
  6. .Net 简单使用 Hangfire
  7. Linux Systemd服务
  8. 如何在AD软件中创建自定义区域铺铜
  9. du和df文件大小不一致问题排查
  10. Android Studio中如何隐藏顶部状态栏和标题栏