// Problem: EV Charging Station Placement
// A highway authority wants to install k electric vehicle charging stations across n pre-approved locations along a highway. The locations are given as an array of integers representing their positions (in km) on the highway.
// To avoid congestion, the authority wants to place the stations such that the minimum distance between any two stations is as large as possible.
// Return that maximum possible minimum distance.
// Example1 :
// locations = [1, 2, 4, 8, 9], k = 3
// Output: 3
// Explanation: Place stations at positions 1, 4, and 9.
// Gaps: (4-1)=3, (9-4)=5 → minimum gap is 3.
// No other placement of 3 stations gives a minimum gap > 3.
// Example2 :
// Input: locations[] = [10, 1, 2, 7, 5], k = 3
// Output: 4
// Explanation: Sort the locations → [1, 2, 5, 7, 10].
// Place stations at positions 1, 5, and 10.
// Gaps: (5-1)=4, (10-5)=5 → minimum gap is 4.
// No other placement of 3 stations yields a minimum gap greater than 4.
//
/* package whatever; // don't place package name! */
import java.util.* ;
import java.lang.* ;
import java.io.* ;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
private static int maxDistance( int [ ] location, int k) {
int low = 0 ;
int high = location[ location.length - 1 ] ;
int answer = 0 ;
while ( low<= high) {
int mid = low + ( high- low) / 2 ;
if ( canPlace( location,k,mid) ) {
answer = mid;
low = mid+ 1 ;
} else {
high = mid- 1 ;
}
}
return answer;
}
private static boolean canPlace( int [ ] location, int k, int mid) {
int stationPlaced = 1 ;
int lastPosition = location[ 0 ] ;
for ( int i = 1 ; i < location.length ; i++ ) {
if ( location[ i] - lastPosition >= mid) {
stationPlaced++;
lastPosition = location[ i] ;
}
if ( stationPlaced>= k) {
return true ;
}
}
return false ;
}
{
//[1, 2, 4, 8, 9], k = 3
int [ ] location = new int [ ] { 10 ,1 ,2 ,7 ,5 } ;
int k = 3 ;
System .
out .
println ( maxDistance
( location,k
) ) ; }
}
Ly8gUHJvYmxlbTogRVYgQ2hhcmdpbmcgU3RhdGlvbiBQbGFjZW1lbnQKLy8gQSBoaWdod2F5IGF1dGhvcml0eSB3YW50cyB0byBpbnN0YWxsIGsgZWxlY3RyaWMgdmVoaWNsZSBjaGFyZ2luZyBzdGF0aW9ucyBhY3Jvc3MgbiBwcmUtYXBwcm92ZWQgbG9jYXRpb25zIGFsb25nIGEgaGlnaHdheS4gVGhlIGxvY2F0aW9ucyBhcmUgZ2l2ZW4gYXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMgcmVwcmVzZW50aW5nIHRoZWlyIHBvc2l0aW9ucyAoaW4ga20pIG9uIHRoZSBoaWdod2F5LgovLyBUbyBhdm9pZCBjb25nZXN0aW9uLCB0aGUgYXV0aG9yaXR5IHdhbnRzIHRvIHBsYWNlIHRoZSBzdGF0aW9ucyBzdWNoIHRoYXQgdGhlIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBhbnkgdHdvIHN0YXRpb25zIGlzIGFzIGxhcmdlIGFzIHBvc3NpYmxlLgovLyBSZXR1cm4gdGhhdCBtYXhpbXVtIHBvc3NpYmxlIG1pbmltdW0gZGlzdGFuY2UuCi8vIEV4YW1wbGUxIDoKIAovLyBsb2NhdGlvbnMgPSBbMSwgMiwgNCwgOCwgOV0sICBrID0gMwovLyBPdXRwdXQ6IDMKIAovLyBFeHBsYW5hdGlvbjogUGxhY2Ugc3RhdGlvbnMgYXQgcG9zaXRpb25zIDEsIDQsIGFuZCA5LgovLyAgICAgICAgICAgICAgR2FwczogKDQtMSk9MywgKDktNCk9NSDihpIgbWluaW11bSBnYXAgaXMgMy4KLy8gICAgICAgICAgICAgIE5vIG90aGVyIHBsYWNlbWVudCBvZiAzIHN0YXRpb25zIGdpdmVzIGEgbWluaW11bSBnYXAgPiAzLgoKLy8gRXhhbXBsZTIgOgovLyBJbnB1dDogbG9jYXRpb25zW10gPSBbMTAsIDEsIDIsIDcsIDVdLCBrID0gMwovLyBPdXRwdXQ6IDQKIAovLyBFeHBsYW5hdGlvbjogU29ydCB0aGUgbG9jYXRpb25zIOKGkiBbMSwgMiwgNSwgNywgMTBdLgovLyAgICAgICAgICAgICAgUGxhY2Ugc3RhdGlvbnMgYXQgcG9zaXRpb25zIDEsIDUsIGFuZCAxMC4KLy8gICAgICAgICAgICAgIEdhcHM6ICg1LTEpPTQsICgxMC01KT01IOKGkiBtaW5pbXVtIGdhcCBpcyA0LgovLyAgICAgICAgICAgICAgTm8gb3RoZXIgcGxhY2VtZW50IG9mIDMgc3RhdGlvbnMgeWllbGRzIGEgbWluaW11bSBnYXAgZ3JlYXRlciB0aGFuIDQuCgovLyAKCgoKCi8qIHBhY2thZ2Ugd2hhdGV2ZXI7IC8vIGRvbid0IHBsYWNlIHBhY2thZ2UgbmFtZSEgKi8KCmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IGphdmEubGFuZy4qOwppbXBvcnQgamF2YS5pby4qOwoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CgkKCXByaXZhdGUgc3RhdGljIGludCBtYXhEaXN0YW5jZShpbnRbXSBsb2NhdGlvbiwgaW50IGspewoJCUFycmF5cy5zb3J0KGxvY2F0aW9uKTsKCQlpbnQgbG93ID0gMDsKCQlpbnQgaGlnaCA9IGxvY2F0aW9uW2xvY2F0aW9uLmxlbmd0aC0xXTsKCQlpbnQgYW5zd2VyID0gMDsKCQl3aGlsZShsb3c8PWhpZ2gpewoJCQlpbnQgbWlkID0gbG93ICsgKGhpZ2gtbG93KS8yOwoJCQlpZihjYW5QbGFjZShsb2NhdGlvbixrLG1pZCkpewoJCQkJYW5zd2VyID0gbWlkOwoJCQkJbG93ID0gbWlkKzE7CgkJCX1lbHNlewoJCQkJaGlnaCA9IG1pZC0xOwoJCQl9CgkJfQoJCXJldHVybiBhbnN3ZXI7Cgl9IAoJCglwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhblBsYWNlKGludFtdIGxvY2F0aW9uLCBpbnQgaywgaW50IG1pZCl7CgkJaW50IHN0YXRpb25QbGFjZWQgPSAxOwoJCWludCBsYXN0UG9zaXRpb24gPSBsb2NhdGlvblswXTsKCQlmb3IoaW50IGkgPSAxOyBpIDwgbG9jYXRpb24ubGVuZ3RoOyBpKyspewoJCQlpZihsb2NhdGlvbltpXS1sYXN0UG9zaXRpb24gPj0gbWlkKXsKCQkJCXN0YXRpb25QbGFjZWQrKzsKCQkJCWxhc3RQb3NpdGlvbiA9IGxvY2F0aW9uW2ldOwoJCQl9CgkJCWlmKHN0YXRpb25QbGFjZWQ+PWspewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoJCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQkvL1sxLCAyLCA0LCA4LCA5XSwgIGsgPSAzCgkJaW50W10gbG9jYXRpb24gPSBuZXcgaW50W117MTAsMSwyLDcsNX07CgkJaW50IGsgPSAzOyAKCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4obWF4RGlzdGFuY2UobG9jYXRpb24saykpOwoJfQp9