示例#1
0
 public void solve(int testNumber, InputReader in, OutputWriter out) {
   long money = in.readLong();
   long fee = in.readLong();
   int count = in.readInt();
   long[] price = new long[count];
   long[] stale = new long[count];
   IOUtils.readLongArrays(in, price, stale);
   long currentDeliveryCost = fee;
   long lastStale = -1;
   long[] antiStale = stale.clone();
   for (int i = 0; i < count; i++) antiStale[i] = -antiStale[i];
   Integer[] order = ListUtils.order(Array.wrap(price), Array.wrap(antiStale));
   long answer = 0;
   for (int i : order) {
     if (lastStale >= stale[i]) continue;
     long p1 = currentDeliveryCost;
     long p2 = price[i];
     long q = stale[i] - lastStale;
     long c = lastStale + 1;
     if (p1 / p2 >= c) {
       if (money / q >= price[i]) {
         long alpha1 = money / (currentDeliveryCost + q * price[i]);
         long beta1 = q * alpha1;
         if (alpha1 * p1 + beta1 * p2 > money) throw new RuntimeException();
         if (beta1 > q * alpha1) throw new RuntimeException();
         answer = Math.max(answer, c * alpha1 + beta1);
         long alpha2 = alpha1 + 1;
         if (alpha2 * currentDeliveryCost <= money) {
           long remainingMoney = money - alpha2 * p1;
           long beta2 = remainingMoney / p2;
           if (alpha2 * p1 + beta2 * p2 > money) throw new RuntimeException();
           if (beta2 > q * alpha2) throw new RuntimeException();
           answer = Math.max(answer, c * alpha2 + beta2);
         }
       } else {
         long alpha = 1;
         long beta = (money - currentDeliveryCost) / p2;
         if (alpha * p1 + beta * p2 > money) throw new RuntimeException();
         if (beta > q * alpha) throw new RuntimeException();
         answer = Math.max(answer, c * alpha + beta);
       }
     } else {
       long alpha = money / p1;
       long remainingMoney = money - alpha * p1;
       long beta = remainingMoney / p2;
       if (remainingMoney / q >= alpha) beta = Math.min(beta, alpha * q);
       if (alpha * p1 + beta * p2 > money) throw new RuntimeException();
       if (beta > q * alpha) throw new RuntimeException();
       answer = Math.max(answer, c * alpha + beta);
     }
     if (money / price[i] >= stale[i] - lastStale) {
       currentDeliveryCost += (stale[i] - lastStale) * price[i];
       lastStale = stale[i];
     } else break;
     if (currentDeliveryCost > money) break;
   }
   out.printLine("Case #" + testNumber + ":", answer);
 }