一、最优服务次序问题
题目
问题描述:设有n个顾客同时等待一项服务,顾客i需要的服务时间为ti,(1<=i<=n)。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?(平均等待时间是n个顾客等待服务时间总和除以n)
输入
第一行为一个正整数n,表示有n个顾客
第二行为n个正整数,表示n个顾客需要的服务时间
输出
最小平均等待时间
代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 100000
int n;//n个顾客
double arr[MAXN];
void input(){
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%lf",&arr[i]);
}
}
double calculate(){
int i = 0;
double sum = 0;//总等待时间
double temp = 0;
for(i = 0;i < n;i++){
temp += arr[i];
sum += temp;
}
return sum/n;
}
int main(){
input();
sort(arr,arr + n);
printf("%.2f\n",calculate());
return 0;
}
注意事项
这一题和下一题的等待时间,都包括了自己本身的服务时间
例如:
第一个人的等待时间 = 0(因为它前面没有人,不需要等)+ 自身所需服务时间
第n个人的等待时间 = 前面所有人的等待时间 + 自身所需服务时间
二、多处最优服务次序问题
题目
问题描述:设有n个顾客同时等待一项服务,顾客i需要的服务时间为ti,(1<=i<=n)。共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使平均等待时间达到最小?
输入
第一行为两个正整数n和s
第二行为n个正整数,表示n个顾客需要的服务时间
输出
最小平均等待时间。
代码
#include<bits/stdc++.h>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 100000
int n,s;//n个顾客,s处可提供此项服务
int arrCustomer[MAXN];//存储用户所需服务时间
int arrCustomerWait[MAXN]; // 用户得到窗口前等待的时间
int arrServe[MAXN];// 每个窗口客户等待时间之和
void input(){
cin>>n>>s;
for(int i = 0;i < n;i ++){
cin>>arrCustomer[i];
}
memset(arrCustomerWait, 0, sizeof(arrCustomerWait));
memset(arrServe, 0, sizeof(arrServe));
}
double caculate(){
int i,j = 0;
for(i = 0;i < n;i++){
arrCustomerWait[j] += arrCustomer[i];
arrServe[j] += arrCustomerWait[j];
j++;
if(j == s)
j = 0;
}
int answer = 0;
for(i = 0;i < s;i ++){
answer += arrServe[i];
}
return 1.0 * answer / n;
}
int main(){
input();
sort(arrCustomer,arrCustomer + n);
printf("%.2f",caculate());
return 0;
}