标签:
Given n pieces of wood with length L[i]
(integer array). Cut them into small pieces to guarantee you could have equal or more than k pieces with the same length. What is the longest length you can get from the n pieces of wood? Given L & k, return the maximum length of the small pieces.
You couldn‘t cut wood into float length.
For L=[232, 124, 456]
, k=7
, return 114
.
Analyse:
Runtime: Time exceeded.
1 class Solution { 2 public: 3 /** 4 *@param L: Given n pieces of wood with length L[i] 5 *@param k: An integer 6 *return: The maximum length of the small pieces. 7 */ 8 int woodCut(vector<int> L, int k) { 9 // write your code here 10 if (L.empty()) return 0; 11 // first sort the array 12 sort(L.begin(), L.end()); 13 // fix the first number x, calculate the times of other numbers to x and sum them to check if exceed k. 14 // If exceeded, use binary divide to narrow the value of x 15 // If not exceeded, save and update result. 16 int result = 0; 17 for (int i = 0; i < L.size(); i++) { 18 // first check if L[i] is the longest length 19 // say if the sum of times of each number <= k, then we need to more devide L[i]; otherwise, let it continue 20 int tempCount = 0; 21 for (int j = 0; j < L.size(); j++) 22 tempCount += L[j] / L[i]; 23 if (tempCount >= k) { 24 result = max(result, L[i]); 25 continue; 26 } 27 else { 28 int low = 1, high = L[i]; 29 while (low <= high) { 30 int tempPieces = 0, mid = low + (high - low) / 2; 31 for (int j = 0; j < L.size(); j++) 32 tempPieces += L[j] / mid; 33 if (tempPieces >= k) { 34 result = max(result, mid); 35 low = mid + 1; 36 } 37 else high = mid - 1; 38 } 39 result = max(result, high); 40 return result; 41 } 42 } 43 return result; 44 } 45 };
Analyse: Find the longest wood and use binary search to find a right one.
1 class Solution { 2 public: 3 /** 4 *@param L: Given n pieces of wood with length L[i] 5 *@param k: An integer 6 *return: The maximum length of the small pieces. 7 */ 8 int woodCut(vector<int> L, int k) { 9 // write your code here 10 if (L.empty()) return 0; 11 12 // find max, use binary search to scan possible values between 1 and max 13 sort(L.begin(), L.end()); 14 int low = 1, high = L[L.size() - 1], result = 0; 15 while (low <= high) { 16 int mid = low + (high - low) / 2, tempPieces = 0; 17 for (int number : L) 18 tempPieces += number / mid; 19 if (tempPieces >= k) { 20 result = max(result, mid); 21 low = mid + 1; 22 } 23 else high = mid - 1; 24 } 25 return result; 26 } 27 };
标签:
原文地址:http://www.cnblogs.com/amazingzoe/p/5800809.html