You are viewing a single comment's thread. Return to all comments →
I wish I had read this comment before. My java code worked with Scanner class but it quite ugly. (Test case 9 was most troublesome for me)
public static int getMaxRemovedItems7(int [] a, int [] b, int x) { int total = 0; int max = 0; ArrayList<Integer> aPrefix = new ArrayList<>(a.length); ArrayList<Integer> bPrefix = new ArrayList<>(b.length); for(int i=0; i<a.length && total <= x; i++) { total += a[i]; aPrefix.add(total); } aPrefix.trimToSize(); total = 0; for(int i=0; i<b.length && total <= x; i++) { total += b[i]; bPrefix.add(total); } bPrefix.trimToSize(); int i=0; while((i+1)<aPrefix.size() && aPrefix.get(i+1) == 0) i++; int jStart = 0; while((jStart+1)<bPrefix.size() && bPrefix.get(jStart+1) == 0) jStart++; for(; i<aPrefix.size() && aPrefix.get(i)<=x; i++) { int j = nearest(bPrefix, jStart, bPrefix.size()-1, x-aPrefix.get(i)); if((aPrefix.get(i)+bPrefix.get(j)) > x && (i+j+1) > max) { max = i+j+1; } else if ((aPrefix.get(i)+bPrefix.get(j)) <= x && (i+j+2) > max) { max = i+j+2; } } if(max >= aPrefix.size() + bPrefix.size()) { return max; } i=0; if((i+1)<bPrefix.size() && bPrefix.get(i+1) == 0) i++; jStart = 0; while((jStart+1)<aPrefix.size() && aPrefix.get(jStart+1) == 0) jStart++; for(; i<bPrefix.size() && bPrefix.get(i)<=x; i++) { int j = nearest(aPrefix, jStart, aPrefix.size()-1, x-bPrefix.get(i)); if((bPrefix.get(i)+aPrefix.get(j)) > x && (i+j+1) > max) { max = i+j+1; } else if ((bPrefix.get(i)+aPrefix.get(j)) <= x && (i+j+2) > max) { max = i+j+2; } } return max; } private static int nearest(List<Integer> arr, int start, int end, int total) { if(start<end) { if(start == (end-1)) { return Math.abs(arr.get(start)-total) <= Math.abs(arr.get(end)-total) ? start : end ; } else { int mid = start + (end-start)/2; if(arr.get(mid) == total) { while(mid+1 < arr.size() && arr.get(mid) == arr.get(mid+1)) mid++; return mid; } else if (arr.get(mid) > total) { while(mid-1 >= 0 && arr.get(mid) == arr.get(mid-1)) mid--; return nearest(arr, start, mid, total); } else { while(mid+1 < arr.size() && arr.get(mid) == arr.get(mid+1)) mid++; return nearest(arr, mid, end, total); } } } return start; }
Seems like cookies are disabled on this browser, please enable them to open this website
Game of Two Stacks
You are viewing a single comment's thread. Return to all comments →
I wish I had read this comment before. My java code worked with Scanner class but it quite ugly. (Test case 9 was most troublesome for me)