首页 > 其他分享 >P1223 排队接水

P1223 排队接水

时间:2023-07-08 12:13:50浏览次数:37  
标签:顺序 text 排队 等待时间 P1223 平均 我们

题目描述

有 \(n\) 个人在一个水龙头前排队接水,假如每个人接水的时间为 \(T_i\),请编程找出这 \(n\) 个人排队的一种顺序,使得 \(n\) 个人的平均等待时间最小。

证明

如果要让所有人等待时间最短,那么就让打水速度快的人在前面

  • \(Part\) \(1\)

因为如果将等待时间较长的人往前排,他们就会占据水龙头的时间较长,后面的人等待的时间更长。

贪心算法的思路就是每次选择等待时间最短的人往前排。这样做的好处是,等待时间较短的人能够尽快接水,释放出水龙头,让后面的人能够更早开始接水,从而减少总体的平均等待时间。

在上面的代码中,我们使用了贪心策略,将等待时间从小到大进行排序,并按照这个顺序建立排队列。这样,等待时间较短的人会尽早进入队列,从而减少了总体的平均等待时间。

  • \(Part\) \(2\)

我们可以使用数学证明的方法来做这道题:

有 \(x\) 人,每个人打水时间为 \(x_{i}\) ,如果让打水速度快的人在前面,那么总时间为:

\[x_{1} (n-1) \times x_{2} (n-2) \cdots x_{i} (n-i) \]

如果要总时间最短,就让 \(x_{1} > x_{2} > x_{3} > \cdots > x_{n}\)

所以,要让平均排队时间最小,就要让打水快的人往前排

  • \(Part\) \(3\)

好的,让我们使用反证法来证明这个结论。

假设存在一种排队顺序,其中等待时间较长的人往前排,但是这种排队顺序的平均等待时间最小。

首先,我们先说明一个引理:

引理: 在任何一个排队顺序中,如果我们交换了两个连续的人的位置,那么平均等待时间要么保持不变,要么减少。

证明:设原始排队顺序为 \(A, B, C, D, E, F\),其中 \(A\) 的等待时间最长。交换 \(B\) 和 \(C\) 的位置,得到新的排队顺序为 \(A, C, B, D, E, F\)。我们假设交换位置后的新平均等待时间比原始平均等待时间更长。那么有:

\[\text{等待时间总和}(A) + \text{等待时间总和}(B,C) < \text{等待时间总和}(A, B, C) \]

但是,如果我们将 \(C\) 插入到 \(A\) 和 \(B\) 之间的位置,也就是得到新的排队顺序 \(A, C, B, D, E, F\),根据平均等待时间的定义,我们可以得到:

\[\text{等待时间总和}(A, C) + \text{等待时间总和}(B) < \text{等待时间总和}(A, B, C) \]

与假设矛盾。所以,我们的假设是错误的,交换的位置并不会导致平均等待时间变长。

现在,我们使用反证法来证明假设的排队顺序不会使平均等待时间最小。

假设我们按照等待时间从小到大进行排序,依次为 \(A, B, C, D, E, F\)。其中,\(A\) 的等待时间最短,\(F\) 的等待时间最长,按照假设的排队顺序,我们将 \(A\) 放在了最后的位置。

现在,我们考虑将 \(A\) 移动到最前面的情况,即排队顺序为 \(A, B, C, D, E, F\)。

根据引理,我们知道这个新的排队顺序的平均等待时间要么保持不变,要么减少就平均等待时间而言,我们可以计算出初始排队顺序和新排队顺序的总等待时间,并比较两者的大小:

  • 初始排队顺序的总等待时间为 \(\text{等待时间}(A) + \text{等待时间}(B, C, D, E, F)\)
  • 新排队顺序的总等待时间为 \(\text{等待时间}(A, B, C, D, E, F)\)

如果新排队顺序的总等待时间小于初始排队顺序的总等待时间,则说明新排队顺序的平均等待时间也会更小。因此,假设的排队顺序不会平均等待时间最小。

根据反证法的原理,我们可以得出结论:要使平均排队时间最小,就要让打水快的人往前排。

算法原理

  • 贪心算法

为了找出平均等待时间最小的排队顺序,我们可以使用贪心算法。贪心算法的基本思想是在每一步选择局部最优解,最终得到全局最优解。

我们可以按照等待时间从小到大的顺序给人员进行排序。这样,等待时间最短的人员先接水,等待时间稍长一些的人员后接水。这样安排,可以使得整体的等待时间减少。

代码实现

#include<iostream>
#include<algorithm>
#include<iomanip>
using namespace std;
#define N 1010

int n,a[N]={0,},b[N];
double t1,t2;

int main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
  {
      cin>>a[i];
      b[i]=a[i];
  } 
  sort(a+1,a+n+1);
  for(int i=1;i<=n;i++)
  {
      t1+=a[i-1];
      t2+=t1;
      for(int j=1;j<=n;j++)
      {
          if(a[i]==b[j])
          {
              cout<<j<<" ";
              b[j]=0; 
          }
      }
  }
  t2/=n;
  printf("\n");
  printf("%.2f",t2);
  return 0;
}

tips

注意题目中的坑——两位小数

  • cout<<fixed<<setprecision(2)(头文件#include<iomanip>);

  • printf("%.2f",a)(头文件就不说了)

标签:顺序,text,排队,等待时间,P1223,平均,我们
From: https://www.cnblogs.com/Cherry929/p/17537003.html

相关文章

  • 排队接水
    排队接水题目描述有\(n\)个人在一个水龙头前排队接水,假如每个人接水的时间为\(T_i\),请编程找出这\(n\)个人排队的一种顺序,使得\(n\)个人的平均等待时间最小。输入格式第一行为一个整数\(n\)。第二行\(n\)个整数,第\(i\)个整数\(T_i\)表示第\(i\)个人的等待时......
  • [C++/PTA] 办事大厅排队
    题目要求在郑州大学综合办事大厅,每天陆陆续续有很多人来排队办事。现在你能否写程序帮助老师时刻了解当前办理业务的情况。输入格式:第一行一个数字N,表示排队信息或者查询信息条目的数量。以下N行,每行的内容有以下3种情况(1)inname表示名字为name的人员新来到办事大厅,排在......
  • C/C++模拟银行排队叫号系统[2023-05-11]
    C/C++模拟银行排队叫号系统[2023-05-11]2、模拟银行排队叫号系统(难度等级A)[问题描述]模拟实现银行的排队叫号系统。[基本要求](1)假定银行上午9点开门,下午5点关门,期间每个小时的客流量不超过35人;(2)每个客户的基本信息包括:到达银行时间、业务需要办理的时长。这两项数据均......
  • 基于蒙特卡洛循环和排队理论的客户结账等待时间模拟优化matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:    当结账窗口数量为22时:到达顾客数:5863服务顾客数:5863损失顾客数:0平均服务时间:0.497495平均队长:11.661919平均等待时长:0.000105顾客不能马上得到服务的概率:0.000020 当结账窗口数量为23时:到达顾客数:5396服务顾客......
  • HDU1873 看病要排队
    E- 看病要排队TimeLimit:1000MS     MemoryLimit:32768KB     64bitIOFormat:%I64d&%I64uDescription看病要排队这个是地球人都知道的常识。不过经过细心的0068的观察,他发现了医院里排队还是有讲究的。0068所去的医院有三个医生(汗,这么......
  • 23-4-14--链表--银行排队问题之单队列多窗口服务
    假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统......
  • Gpssworld仿真(二):并排排队系统模拟
    4.3某一个加油站能够配给三个级别的燃油:①家庭取暖用的燃油;②轻工业用的燃油;③运输用的燃油。每一级别的燃油都有一个对应的油泵。订单中燃油的数量在3000加仑和5000加仑中变化,每次增加10加仑,是均匀分布。这个站点最多能容纳12辆车。来加油站装油的汽车到达的平均时间间隔是18分......
  • 奶牛排队【题解】
    题目描述奶牛在熊大妈的带领下排成了一条直队。显然,不同的奶牛身高不一定相同……现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛\(A\)是最矮的,最右边的\(B\)是最高的,且\(B\)高于\(A\)奶牛。中间如果存在奶牛,则身高不能和\(A,B\)奶牛相同。问这样的奶牛最......
  • AcWing 1215. 小朋友排队
    n个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增......
  • 排队论——系统运行指标的R语言实现
    排队论也称随机服务系统理论,排队论又叫随机服务系统理论或公用事业管理中的数学方法。它是研究各种各样的排队现象的。它所要解决的主要问题是:在排队现象中设法寻求能够达到服务标准的最少设备,使得在满足服务对象条件下,服务机构的花费最为经济,使服务系统效率最高。排队现象作为......