2013年3月23号竞赛题目一 平衡负载
来源:互联网 发布:2017网络项目 编辑:程序博客网 时间:2024/04/30 14:12
平衡负载
Du熊正在负责一个大型的项目,目前有K台服务器,有N个任务需要用这K台服务器来完成,所以要把这些任务分成K个部分来完成,在同上台服务器上执行的任务必须是连续的任务,每个任务有各自需要的执行时间。
例如N=5,K=2,每个任务需要时间分别为5,3,1,4,7分钟,那么我们可以分成(5)(3 1 4 7)两部分,这样第一台服务器所花时间就是5分钟,而第二台机器需要花15分钟,当然,所有任务完成的时间是按最迟完成的那台服务器的时间,即这样划分的话完成所有任务所需要的时间就是15分钟。而另外一种划分方法是(5 3 1)(4 7),这种划分方案完成所有任务的时间就是11分钟,也是最优的一种划分方案。
现在你的任务就是根据给定的N,K和每个任务要花费的时间,找出使完成所有任务时间最短的方案。
输入:
多组输入。
第一行输入N和K(1<=K<=N<=10000)。
第二行输入N个不大于1000的正整数,表示各个任要花费的时间。
N=K=0表示输入结束。
输出:
每行输出一个整数,对应对于每个数据(除了N=K=0不用输出)。
样例输入:
5 1
5 3 1 4 7
5 2
5 3 1 4 7
5 3
5 3 1 4 7
10 3
1 2 3 4 5 6 7 8 9 10
0 0
样例输出:
20
11
8
21
分析:给定一个长度为n的数列,分成连续的k段,使k段和中的最大值最小
#include<cstdio>int sum(int A[],int from,int to){ int total=0,i; for(i=from;i<=to;i++)total+=A[i]; return total; } int getMax(int A[],int n){ int max=0,i; for(i=0;i<n;i++){ if(A[i]>max)max=A[i]; } return max; } int getSum(int A[],int n){ int total=0,i; for(i=0;i<n;i++)total+=A[i]; return total; } int cal(int A[],int n,int m){ int total=0,num=1; for (int i=0;i<n;i++) { total+=A[i]; if(total>m){ total=A[i]; num++; } } return num; } int BS(int A[],int n,int k){ int l=getMax(A,n); int h=getSum(A,n); while(l<h){ int m=l+(h-l)/2; int res=cal(A,n,m); if(res<=k)h=m; else l=m+1; } return l; }int a[10002];int main(){int n,k,i;while(~scanf("%d%d",&n,&k)){if(n==0&&k==0)break;for(i=0;i<n;i++)scanf("%d",&a[i]);printf("%d\n",BS(a,n,k));}return 0;}
- 2013年3月23号竞赛题目一 平衡负载
- 2013百度之星 2012年12月23号竞赛题目一
- 百度之星——2012年12月23号竞赛题目一
- 2013年3月30日竞赛题目二 Sigma
- 【百度之星12月23号竞赛题目一】Du熊做实验
- 百度之星——2012年12月30号竞赛题目一
- 百度2013年4月27日竞赛题目二
- 【百度之星邀请月赛12月11号竞赛题目一】du熊学斐波那契I
- 百度之星2012年12月11日竞赛题目二--du熊填数字
- 负载平衡
- 负载平衡
- 平衡负载
- 负载平衡
- 负载平衡
- 负载平衡
- 负载平衡
- 负载平衡
- 负载平衡
- spring+springmvc+openjpa的逆向工程整合出错
- Android中Back键与Home键的区别
- 第五周上级项目三
- VB中的 命名参数
- (转)内联函数
- 2013年3月23号竞赛题目一 平衡负载
- 黑马程序员————学习日记【2】 【Java编程基础1】
- Thinking in Java之接口回调
- Uva 10048 - Audiophobia
- 第五周上级项目四
- Linux kernel探究IO Scheduling
- jquery $.ajax各个事件执行顺序
- 在CentOS 6.3上安装Windchill PDMLink 10.1
- linux下搭建hadoop集群问题备忘录