大牛代码

来源:互联网 发布:网络十大博客公司 编辑:程序博客网 时间:2024/06/05 21:56

#include<iostream>using namespace std;int N, K;int arr[10005];bool ok(int v){int index = 0;int ki = 0;int sumi = 0;while(index < N && ki < K){if(sumi + arr[index] <= v){sumi += arr[index];index ++;continue;}ki++;sumi = 0;}return ki < K;}int balance(int sum , int maxIter){int average = (sum + N - 1) / N;int left = average > maxIter ? average : maxIter; int right = sum;while (left <= right) {int middle = (left + right)/2;if(ok(middle))right = middle-1;else left = middle+1;}return left; }int main(){freopen("Leetinput.txt", "r", stdin);while(scanf("%d %d", &N, &K) != EOF){if ( N == 0 && K==0 )return 0;int sum = 0;int maxItem = 0;for(int i=0; i<N; i++){scanf("%d", &arr[i]);sum += arr[i];if(arr[i] > maxItem)maxItem = arr[i];}if( K == 1){printf("%d\n", sum);continue;}printf("%d\n", balance(sum, maxItem));}return 0;}

设M表示每台服务器的最长允许工作时间,则M的取值范围为【n个数中的最大者-->sum(n个数的和)】,从小到大枚举其中的每一个数,然后判断K台服务器能够把N个任务做完吗?第一个即为所求。但是这种效率很低,我们可以使用二分找到满足情况最小的那个。大牛代码如下: