#include <stdio.h>
/*
第四届程序设计大赛 最优服务
Time Limit:1000MS Memory Limit:65536K
Total Submit:106 Accepted:55
Description
设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti
共有 s处可以提供此项服务。应如何安排n 个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。
对于给定的n个顾客需要的服务时间和s的值,编程计算最优服务次序。
Input
第一行有 2 个正整数n 和 s (0 < s <= n <= 100),表示有n 个顾客且有 s处可以提供顾客需要的服务。 接下来的1 行中,有n个正整数, 表示n个顾客需要的服务时间。
Output
输出最小平均等待时间,保留两位小数。
Sample Input
10 2
56 12 1 99 1000 234 33 55 99 812
思路:
窗口1 窗口2 //小的排前面平均等待时间最少
1 12
33 55
56 99
99 234
812 1000
Sample Output
336.00
Source
*/
//对数组进行从小到大排序 (选择排序)
void arrpi(int arr[],int n)
{
int i,j;
int temp;
for(i=0;i<n-1;i++)
{
for(j=i;j<n;j++)
{
if(arr[i]>arr[j])
{
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
//数组输入函数
void arrScanf(int arr[],int n)
{
int i,j;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
}
//数组打印函数,打印每个窗口对应的人。有s个窗口
//该函数是用于调试程序
/*
输入
10 2
56 12 1 99 1000 234 33 55 99 812
输出
窗口1 窗口2
1 12
33 55
56 99
99 234
812 1000
*/
void arrPrintf(int arr[],int n,int s)
{
int i;
int t=1;
for(i=0;i<n;i++)
{
printf("%d\t",arr[i]);
t++;
if(t%(s+1)==0)
{
printf("\n");
t=1;
}
}
}
//将数组全部赋值为0
void arrZero(int arr[],int n)
{
int i;
for(i=0;i<n;i++)
{
arr[i]=0;
}
}
//计算1-s个窗口中,等待的时间总和
//这部分最复杂
time(int arr[],int n,int s)
{
int time=0;//定义一个总时间变量
int i;
int count;//定义一个计数器,记录人最多的窗口有几个人
int t;
if(n%s!=0)//如果每个窗口人数不相同
{
int control;//定义一个控制器, 根据窗口排队人数来计算窗口等待的人数
count=n/s+1;//如果每个窗口人数不一样,取整数部分再加一
t=count+1;//这个加一是因为下面定义 if((i+1)%s==1) t--; 刚开始就满足,所以先加一
for(i=0;i<n;i++)
{
if((i+1)%s>=1&&(i+1)%s<=n%s) control=1;//如果是每个窗口排队人数不一样,多的队伍乘以t
else control=0;//少的队伍乘以t-1
if((i+1)%s==1) t--;
if(control==1) time+=arr[i]*t;
else time+=arr[i]*(t-1);
}
}
else//如果队伍是一个矩阵
{
count=n/s; //每个窗口排队人数
t=count+1; //这个加一是因为下面定义 if((i+1)%s==1) t--; 刚开始就满足,所以先加一
for(i=0;i<n;i++)
{
if((i+1)%s==1) t--;
time+=arr[i]*t; //等待的人数乘以时间
}
}
return time;
}
int main(void)
{
int n=0,s=0;//有n个人,s个窗口
int allTime=0;//总时间
double everyTime=0;//每个人的等待时间(平均等待时间)
int arr[100];//定义一个数组来记录每个人分别需要的时间
arrZero(arr,100);//将数组中的每一个元素赋值为0
scanf("%d %d",&n,&s); //输入人数和窗口数
arrScanf(arr,n);//将个人分别需要的时间输入数组
arrpi(arr,n);//将数组中的每一个元素从小到大排序
//arrPrintf(arr,n,s);//打印每个窗口等待的人
allTime=time(arr,n,s);//计算总时间
everyTime=1.0*allTime/n;//计算平均时间
printf("%.2lf",everyTime);//输出每个人的平均等待时间
return 0;
}
1052第四届程序设计大赛 最优服务
最新推荐文章于 2026-05-22 17:43:28 发布
本次大赛聚焦程序设计,重点在于使用C语言进行算法优化,旨在提升服务性能。参赛者展示出高超的编程技巧,通过算法创新实现服务效率的显著提升。
312

被折叠的 条评论
为什么被折叠?



