1052第四届程序设计大赛 最优服务

来源:互联网 发布:怎么去掉知乎标题 编辑:程序博客网 时间:2024/06/08 01:29
#include <stdio.h> /*第四届程序设计大赛 最优服务Time Limit:1000MS  Memory Limit:65536KTotal Submit:106 Accepted:55Description设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti 共有 s处可以提供此项服务。应如何安排n 个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。 对于给定的n个顾客需要的服务时间和s的值,编程计算最优服务次序。 Input第一行有 2 个正整数n 和 s (0 < s <= n <= 100),表示有n 个顾客且有 s处可以提供顾客需要的服务。 接下来的1 行中,有n个正整数, 表示n个顾客需要的服务时间。Output输出最小平均等待时间,保留两位小数。Sample Input10 256 12 1 99 1000 234 33 55 99 812思路:     窗口1 窗口2   //小的排前面平均等待时间最少     1       12    33      55    56      99    99      234    812     1000Sample Output336.00Source*/ //对数组进行从小到大排序 (选择排序) 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 256 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;}
阅读全文
0 0
原创粉丝点击