首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责
时光限制:
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
---------------------------------