Example #1
0
  private int solveIt(int casenr) {
    int n = io.getInt();
    if (n == 0) {
      return 0;
    }
    double[] perc = new double[n];
    double mod = .5;
    for (int i = 0; i < n; i++) {
      String word = io.getWord();
      if (i == 0 && word.contains(".")) {
        String wrd = word.split("\\.")[1];
        for (int j = 0; j < wrd.length(); j++) {
          mod /= 10;
        }
      }
      perc[i] = Double.parseDouble(word) / 100.d;
    }
    double s = 0;
    mod /= 100;
    for (int i = 0; i < perc.length; i++) {
      s += perc[i];
    }

    if (perc.length <= 2 && Math.abs(s - 0.99) < 1e-10) {
      return -1;
    }

    out:
    for (int pp = 1; pp < 10000; pp++) {
      int minleft = pp;
      int maxleft = pp;

      for (int i = 0; i < perc.length; i++) {
        double use = perc[i] * pp;
        double min = Math.floor(use);
        if (min / pp > perc[i] - mod && min > 0) {

        } else if ((min + 1) / pp < perc[i] + mod) {
          min++;
        } else {
          continue out;
        }
        double max = min;
        while ((min - 1) / pp >= perc[i] - mod) {
          min--;
        }
        while ((max + 1) / pp <= perc[i] + mod) {
          max++;
        }
        minleft -= max;
        maxleft -= min;
      }
      if (minleft <= maxleft && minleft <= 0 && maxleft >= 0) {
        return pp;
      }
    }
    return -1;
  }
Example #2
0
  private void solve() throws Throwable {
    io = new ZKattio(stream);
    long t0 = -System.currentTimeMillis();
    int n = io.getInt();
    int[] midcnt = new int[n];
    int[] botcnt = new int[n];
    int[] topPos = new int[n];
    List[] midPos = new ArrayList[n];
    List[] botPos = new ArrayList[n];
    int[][] nodes = new int[n][3];

    for (int i = 0; i < n; i++) {
      midPos[i] = new ArrayList();
      botPos[i] = new ArrayList();
    }
    for (int i = 0; i < n; i++) {
      int v = io.getInt() - 1;
      topPos[v] = i; // .add(i);
      nodes[i][0] = v;
    }
    for (int i = 0; i < n; i++) {
      int num = io.getInt() - 1;
      midPos[num].add(i);
      midcnt[num]++;
      nodes[i][1] = num;
    }
    for (int i = 0; i < n; i++) {
      int num = io.getInt() - 1;
      botPos[num].add(i);
      botcnt[num]++;
      nodes[i][2] = num;
    }
    Stack<Integer> todo = new Stack();
    boolean[] in = new boolean[n];
    Arrays.fill(in, true);
    for (int i = 0; i < n; i++) {
      if (botcnt[i] < 1 || midcnt[i] < 1) {
        todo.add(i);
        in[i] = false;
      }
    }
    boolean[] columnDone = new boolean[n];
    while (todo.size() > 0) {
      Integer pop = todo.pop();
      List<Integer> colrm = new ArrayList();
      colrm.add(topPos[pop]);
      for (int i = 0; i < midPos[pop].size(); i++) {
        Integer c = (Integer) midPos[pop].get(i);
        colrm.add(c);
      }
      for (int i = 0; i < botPos[pop].size(); i++) {
        Integer c = (Integer) botPos[pop].get(i);
        colrm.add(c);
      }
      for (int i = 0; i < colrm.size(); i++) {
        Integer rm = colrm.get(i);
        if (columnDone[rm]) {
          continue;
        }
        columnDone[rm] = true;
        int[] js = nodes[rm];
        midcnt[js[1]]--;
        if (midcnt[js[1]] < 1 && in[js[1]]) {
          todo.add(js[1]);
          in[js[1]] = false;
        }
        botcnt[js[2]]--;
        if (botcnt[js[2]] < 1 && in[js[2]]) {
          todo.add(js[2]);
          in[js[2]] = false;
        }
        if (in[js[0]]) {
          in[js[0]] = false;
          todo.add(js[0]);
        }
      }
    }
    int ans = 0;
    for (int i = 0; i < in.length; i++) {
      if (!in[i]) {
        ans++;
      }
    }
    if (test) {
      System.out.println(System.currentTimeMillis() + t0);
    }
    System.out.println(ans);
  }