等待时间clientNYOJ 179 LK's problem

首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责

    时光限制:

    3000

 ms  |  内存限制:

    65535

 KB

    难度:

    1

2
1 2
1 10
1
10 
50 50
0

    

样例输出

    

21
60

    题意

    

    银行开门之前,一些人已经在门口等着办理业务。一个人等待的时光=开门前等待时光+开门后排队时光+办理业务所用时光。每一个人办理业务所用时光雷同,且看门后没有新增的人。问如何布置这些人的顺序,能够使得等待时光最长的那个人等待的时光最短。求等待时光最长的那个人等待的时光的最小值。

           每组数据先输入一个N,代表有N个人,第二行有N个数,代表每一个人在银行开门前的等待时光,第三行有二个数,分别代表银行服务人员的个数和每一个人办理业务所用的时光(每一个人所用时光雷同).输出等待时光最长的那个人等待的时光的最小值。

             刚开始看完这个题,我的想法是这样的:先对每一个人的等待时光排序,然后求出开门前等待时光最短的那个人所用的时光就好了。后来细心想想不可,比如

    每日一道理
青春是用意志的血滴和拼搏的汗水酿成的琼浆——历久弥香;青春是用不凋的希望和不灭的向往编织的彩虹——绚丽辉煌;青春是用永恒的执著和顽强的韧劲筑起的一道铜墙铁壁——固若金汤。

    5

    1 2 3 4 5

    2 1

    这组数据,如果用那种方法做,最短时光为3,而实际上应该是6。

    所以应该是先对开门前等待时光排序后,求出每一个人所用的时光(开门前等待时光长的先办理),然后再对每一个人所用时光排序,输出最大的那个时光即可。感到有点贪心算法的思想。

    代码:

    

    #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main() { int n,a[102],i,t,c,min,s[102],j,p; while(~scanf("%d",&n)&&n) { for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n);/*对开门前的等待时光排序*/ scanf("%d%d",&c,&t); memset(s,0,sizeof(s)); j=0,p=1; for(i=n-1;i>=0;i--) { if(j==c) { p++; j=0; } j++; s[i]=a[i]+p*t; /*求出每一个人所用的时光*/ } sort(s,s+n); /*再次排序*/ printf("%d\n",s[n-1]); /*输出最大值*/ } return 0; }

    

 

文章结束给大家分享下程序员的一些笑话语录: 这年头的互联网真是娱乐了中国,网民们从各种各样的“门”里钻来钻去,又有好多“哥”好多“帝”,值得大家品味不已……网络经典语录,关于IT与互联网,经典与您分享!

--------------------------------- 原创文章 By
等待时间和client
---------------------------------

posted @ 2013-05-26 23:14  xinyuyuanm  阅读(175)  评论(0编辑  收藏  举报