Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>So here is the algorithm I thought it would work:</p> <ol> <li>Sort the volumes from largest to smallest.</li> <li>Divide the largest cake to 1...k people, i.e., target = volume[0]/i, where i = 1,2,3,4,...,k</li> <li>If target would lead to total number of pieces greater than k, decrease the number i and try again.</li> <li>Find the first number <strong>i</strong> that will result in total number of pieces greater than or equal to K but <strong>(i-1)</strong> will lead to a total number of cakes less than k. Record this volume as baseVolume.</li> <li>For each remaining cake, find the smallest fraction of remaining volume divide by number of people, i.e., division = (V_cake - (baseVolume*(Math.floor(V_cake/baseVolume)) ) / Math.floor(V_cake/baseVolume)</li> <li>Add this amount to the baseVolume(baseVolume += division) and recalculate the total pieces all volumes could divide. If the new volume result in less pieces, return previous value, otherwise, repeat step 6.</li> </ol> <p>Here are the java codes:</p> <pre><code>public static int getKonLagestCake(Integer[] sortedVolumesList, int k) { int result = 0; for (int i = k; i &gt;= 1; i--) { double volumeDividedByLargestCake = (double) sortedVolumesList[0] / i; int totalNumber = totalNumberofCakeWithGivenVolumn( sortedVolumesList, volumeDividedByLargestCake); if (totalNumber &lt; k) { result = i + 1; break; } } return result; } public static int totalNumberofCakeWithGivenVolumn( Integer[] sortedVolumnsList, double givenVolumn) { int totalNumber = 0; for (int volume : sortedVolumnsList) { totalNumber += (int) (volume / givenVolumn); } return totalNumber; } public static double getMaxVolume(int[] volumesList, int k) { List&lt;Integer&gt; list = new ArrayList&lt;Integer&gt;(); for (int i : volumesList) { list.add(i); } Collections.sort(list, Collections.reverseOrder()); Integer[] sortedVolumesList = new Integer[list.size()]; list.toArray(sortedVolumesList); int previousValidK = getKonLagestCake(sortedVolumesList, k); double baseVolume = (double) sortedVolumesList[0] / (double) previousValidK; int totalNumberofCakeAvailable = totalNumberofCakeWithGivenVolumn(sortedVolumesList, baseVolume); if (totalNumberofCakeAvailable == k) { return baseVolume; } else { do { double minimumAmountAdded = minimumAmountAdded(sortedVolumesList, baseVolume); if(minimumAmountAdded == 0) { return baseVolume; }else { baseVolume += minimumAmountAdded; int newTotalNumber = totalNumberofCakeWithGivenVolumn(sortedVolumesList, baseVolume); if(newTotalNumber == k) { return baseVolume; }else if (newTotalNumber &lt; k) { return (baseVolume - minimumAmountAdded); }else { continue; } } }while(true); } } public static double minimumAmountAdded(Integer[] sortedVolumesList, double volume) { double mimumAdded = Double.MAX_VALUE; for(Integer i:sortedVolumesList) { int assignedPeople = (int)(i/volume); if (assignedPeople == 0) { continue; } double leftPiece = (double)i - assignedPeople*volume; if(leftPiece == 0) { continue; } double division = leftPiece / (double)assignedPeople; if (division &lt; mimumAdded) { mimumAdded = division; } } if (mimumAdded == Double.MAX_VALUE) { return 0; }else { return mimumAdded; } } </code></pre> <p>Any Comments would be appreciated. Thanks</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload