Java solution for problem Cafeteria, from TopCoder:
public class Cafeteria
{
int sx, sy;
int T = 14 * 60 + 30;
int q, r;
public String latestTime(int[] offset, int[] walkingTime, int[] drivingTime)
{
int N = offset.length;
int[] times = new int[N];
int maxTime = Integer.MIN_VALUE, idx = -1;
for(int i = 0; i < N; i++) {
int temp = Math.abs(T - drivingTime[i]);
int q = temp / 60;
int r = temp % 60;
for(int o = 50 + offset[i]; ; o -= 10) if(o <= r) {
temp = (o + q * 60) - walkingTime[i];
break;
}
times[i] = temp;
if(times[i] > maxTime) {
maxTime = times[i];
idx = i;
}
}
q = times[idx] / 60;
if(q > 12) q -= 12;
r = times[idx] % 60;
String sq = (q < 10) ? "0"+q : ""+q;
String sr = (r < 10) ? "0"+r : ""+r;
return sq + ":" + sr;
}
public static void main(String[] args)
{
Cafeteria c = new Cafeteria();
int[] offset = {9};
int[] walkingTime = {1};
int[] drivingTime = {1};
System.out.println(c.latestTime(offset, walkingTime, drivingTime));
System.out.println(c.latestTime(
new int[]{6},
new int[]{9},
new int[]{120}));
System.out.println(c.latestTime(
new int[]{6,9},
new int[]{9,10},
new int[]{120,121}));
System.out.println(c.latestTime(
new int[]{0,1,2,3,4,5,6,7,8,9},
new int[]{11,11,11,11,11,11,11,11,11,11},
new int[]{190,190,190,190,190,190,190,190,190,190}));
System.out.println(c.latestTime(
new int[]{7,4,0,0,2,1,6,7,7,0,8,6,0,5,0,6,7,9,0,2,4,8,4,7,
9,2,4,4,3,1,4,5,8,8,2,5,7,8,7,5,6,8,8,0,1,3,5,0,8},
new int[]{26,14,1,4,16,28,16,6,4,5,21,18,5,2,21,21,28,22,5,22,26,16,14,
19,19,19,4,12,24,4,30,16,28,20,25,2,30,18,4,6,9,22,8,3,7,29,8,30,6},
new int[]{151,264,280,89,63,57,15,120,28,296,76,269,90,106,31,222,
291,52,102,73,140,248,44,187,76,49,296,106,54,119,54,283,263,
285,275,127,108,82,84,241,169,203,244,256,109,288,9,262,103}));
}
}