// ==================================================================================
// Problem: Piles of Boxes
// ==================================================================================
// Given an array where each element represents the height of a pile of boxes,
// reduce the height of the largest pile to match the next smaller pile until all
// piles are of equal height. Count the number of operations needed to do so.
//
// Best Case:
// - All elements are already equal.
// - Only sorting and one equality check are needed.
// - Time Complexity: O(n log n)
// - Space Complexity: O(1)
//
// Worst Case:
// - Maximum height differences between elements.
// - Sorting once, followed by multiple passes reducing larger piles.
// - Time Complexity: O(n^2)
// - Space Complexity: O(1) — no extra data structures used.
//
// Note: Even if input is taken from the user, space complexity remains O(1)
// as no additional memory is used beyond the required input.
//
// By Avinash Sinha
// ==================================================================================
import java.util.*;
class Ideone {
public static void main
(String[] args
) { int[] arr ={4,5,5,2,4};
System.
out.
println(pilesOfBoxes
(arr
)); }
public static int pilesOfBoxes(int[] arr) {
Arrays.
sort(arr
); // Sort the array in increasing order int n = arr.length;
int count = 0;
// Continue until all piles are equal
while (!allEqual(arr)) {
for (int i = n - 1; i >= 1; i--) {
if (arr[i] != arr[i - 1]) {
arr[i] = arr[i - 1]; // Reduce the larger pile to match the smaller one
count++; // Increment the operation count
}
}
}
return count; // Return the total number of operations
}
// Check if all piles are equal
public static boolean allEqual(int[] arr) {
for (int i = 1; i < arr.length; i++) {
if (arr[i] != arr[0]) return false; // If any pile differs, return false
}
return true; // Return true if all piles are the same height
}
}
/* Dry Run Example:
Input: {5, 2, 1}
After sorting: {1, 2, 5}
First iteration:
arr = {1, 2, 2} -> 5 is reduced to 2, count = 1
Second iteration:
arr = {1, 1, 2} -> 2 is reduced to 1, count = 2
Final result: arr = {1, 1, 1}, count = 3
Output: 3
*/
Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQcm9ibGVtOiBQaWxlcyBvZiBCb3hlcwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIEdpdmVuIGFuIGFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCByZXByZXNlbnRzIHRoZSBoZWlnaHQgb2YgYSBwaWxlIG9mIGJveGVzLAovLyByZWR1Y2UgdGhlIGhlaWdodCBvZiB0aGUgbGFyZ2VzdCBwaWxlIHRvIG1hdGNoIHRoZSBuZXh0IHNtYWxsZXIgcGlsZSB1bnRpbCBhbGwKLy8gcGlsZXMgYXJlIG9mIGVxdWFsIGhlaWdodC4gQ291bnQgdGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG5lZWRlZCB0byBkbyBzby4KLy8KLy8gQmVzdCBDYXNlOgovLyAtIEFsbCBlbGVtZW50cyBhcmUgYWxyZWFkeSBlcXVhbC4KLy8gLSBPbmx5IHNvcnRpbmcgYW5kIG9uZSBlcXVhbGl0eSBjaGVjayBhcmUgbmVlZGVkLgovLyAtIFRpbWUgQ29tcGxleGl0eTogTyhuIGxvZyBuKQovLyAtIFNwYWNlIENvbXBsZXhpdHk6IE8oMSkKLy8KLy8gV29yc3QgQ2FzZToKLy8gLSBNYXhpbXVtIGhlaWdodCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGVsZW1lbnRzLgovLyAtIFNvcnRpbmcgb25jZSwgZm9sbG93ZWQgYnkgbXVsdGlwbGUgcGFzc2VzIHJlZHVjaW5nIGxhcmdlciBwaWxlcy4KLy8gLSBUaW1lIENvbXBsZXhpdHk6IE8obl4yKQovLyAtIFNwYWNlIENvbXBsZXhpdHk6IE8oMSkg4oCUIG5vIGV4dHJhIGRhdGEgc3RydWN0dXJlcyB1c2VkLgovLwovLyBOb3RlOiBFdmVuIGlmIGlucHV0IGlzIHRha2VuIGZyb20gdGhlIHVzZXIsIHNwYWNlIGNvbXBsZXhpdHkgcmVtYWlucyBPKDEpCi8vIGFzIG5vIGFkZGl0aW9uYWwgbWVtb3J5IGlzIHVzZWQgYmV5b25kIHRoZSByZXF1aXJlZCBpbnB1dC4KLy8KLy8gQnkgQXZpbmFzaCBTaW5oYQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKaW1wb3J0IGphdmEudXRpbC4qOwoKIGNsYXNzIElkZW9uZSB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgaW50W10gYXJyID17NCw1LDUsMiw0fTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocGlsZXNPZkJveGVzKGFycikpOyAKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGludCBwaWxlc09mQm94ZXMoaW50W10gYXJyKSB7CiAgICAgICAgQXJyYXlzLnNvcnQoYXJyKTsgLy8gU29ydCB0aGUgYXJyYXkgaW4gaW5jcmVhc2luZyBvcmRlcgogICAgICAgIGludCBuID0gYXJyLmxlbmd0aDsKICAgICAgICBpbnQgY291bnQgPSAwOwoKICAgICAgICAvLyBDb250aW51ZSB1bnRpbCBhbGwgcGlsZXMgYXJlIGVxdWFsCiAgICAgICAgd2hpbGUgKCFhbGxFcXVhbChhcnIpKSB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSBuIC0gMTsgaSA+PSAxOyBpLS0pIHsKICAgICAgICAgICAgICAgIGlmIChhcnJbaV0gIT0gYXJyW2kgLSAxXSkgewogICAgICAgICAgICAgICAgICAgIGFycltpXSA9IGFycltpIC0gMV07IC8vIFJlZHVjZSB0aGUgbGFyZ2VyIHBpbGUgdG8gbWF0Y2ggdGhlIHNtYWxsZXIgb25lCiAgICAgICAgICAgICAgICAgICAgY291bnQrKzsgLy8gSW5jcmVtZW50IHRoZSBvcGVyYXRpb24gY291bnQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNvdW50OyAvLyBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBvcGVyYXRpb25zCiAgICB9CgogICAgLy8gQ2hlY2sgaWYgYWxsIHBpbGVzIGFyZSBlcXVhbAogICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFsbEVxdWFsKGludFtdIGFycikgewogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChhcnJbaV0gIT0gYXJyWzBdKSByZXR1cm4gZmFsc2U7IC8vIElmIGFueSBwaWxlIGRpZmZlcnMsIHJldHVybiBmYWxzZQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gUmV0dXJuIHRydWUgaWYgYWxsIHBpbGVzIGFyZSB0aGUgc2FtZSBoZWlnaHQKICAgIH0KfQoKLyogRHJ5IFJ1biBFeGFtcGxlOgogICBJbnB1dDogezUsIDIsIDF9CiAgIEFmdGVyIHNvcnRpbmc6IHsxLCAyLCA1fQoKICAgRmlyc3QgaXRlcmF0aW9uOgogICBhcnIgPSB7MSwgMiwgMn0gLT4gNSBpcyByZWR1Y2VkIHRvIDIsIGNvdW50ID0gMQogICAKICAgU2Vjb25kIGl0ZXJhdGlvbjoKICAgYXJyID0gezEsIDEsIDJ9IC0+IDIgaXMgcmVkdWNlZCB0byAxLCBjb3VudCA9IDIKICAgCiAgIEZpbmFsIHJlc3VsdDogYXJyID0gezEsIDEsIDF9LCBjb3VudCA9IDMKICAgT3V0cHV0OiAzCiovCgoKCg==