import java.util.*; public class b { Scanner in=new Scanner(System.in); public static void main(String[] args) { new b().go(); } private void go() { int t=in.nextInt(); for(int cnum=0;cnum p=new ArrayList(); for(int i=0;i0){//binary search on minutes to find min int tempans = eval_minute_count(diff+m, p); if(tempans>=1; } for(int i=Math.max(0, m-10);i pq=new PriorityQueue(p.size(),Collections.reverseOrder()); pq.addAll(p); for(int k=0;kon/2+1||j>=on){//biggest stack is smaller than our optimal size already...break pq.offer(on); break; } pq.offer(on-j);//take j off the stack in a new pile pq.offer(j); } ans=Math.min(ans, i+pq.peek());//special minutes plus biggest plate left } } System.out.printf("Case #%d: %d\n",cnum+1,ans); } } private int eval_minute_count(int i, ArrayList p) { int ans=eval_flip(1,i,p); int diff=1; while(diff<=p.get(0)/2)diff<<=1;//optimal size is less than half the size the largest stack diff>>=1; int f=0; while(diff>0){//binary search again! int tempans = eval_flip(f+diff,i,p); if(tempans>=1; } return ans; } private int eval_flip(int j, int i, ArrayList p) { PriorityQueue pq=new PriorityQueue(p.size(),Collections.reverseOrder()); pq.addAll(p); for(int k=0;kon/2+1||j>=on){//biggest stack is smaller than our optimal size already...break pq.offer(on); break; } pq.offer(on-j);//take j off the stack in a new pile pq.offer(j); } return i+pq.peek(); } }