Guest User

Untitled

a guest
Nov 18th, 2012
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.65 KB | None | 0 0
  1. void gen(ArrayList<Integer> length, ArrayList<Integer> times) {
  2.         if (length.size() == 0) {
  3.             for (int i = 0; i < times.size(); i++) {
  4.                 for (int j = i + 1; j < times.size(); j++)
  5.                     time[times.get(j) - times.get(i)] = true;
  6.             }
  7.             return;
  8.         }
  9.         for (int mask = 1; mask < pow[length.size()]; mask++) {
  10.             int minTime = Integer.MAX_VALUE;
  11.             for (int i = 0; i < length.size(); i++) {
  12.                 int maskI = (mask / pow[i]) % 3;
  13.                 if (maskI == 1)
  14.                     minTime = Math.min(minTime, length.get(i));
  15.                 if (maskI == 2)
  16.                     minTime = Math.min(minTime, length.get(i) / 2);
  17.             }
  18.             ArrayList<Integer> newLength = new ArrayList<Integer>();
  19.             for (int i = 0; i < length.size(); i++) {
  20.                 int maskI = (mask / pow[i]) % 3;
  21.                 int nextLen = length.get(i);
  22.                 if (maskI == 1)
  23.                     nextLen -= minTime;
  24.                 if (maskI == 2)
  25.                     nextLen -= 2 * minTime;
  26.                 if (nextLen != 0)
  27.                     newLength.add(nextLen);
  28.             }
  29.             times.add(times.get(times.size() - 1) + minTime);
  30.             gen(newLength, times);
  31.             times.remove(times.size() - 1);
  32.         }
  33.     }
  34.  
  35.     void precalc(int n) {
  36.         pow = new int[n + 1];
  37.         pow[0] = 1;
  38.         for (int i = 1; i <= n; i++)
  39.             pow[i] = 3 * pow[i - 1];
  40.         ArrayList<Integer> curArr = new ArrayList<Integer>();
  41.         for (int i = 0; i < n; i++)
  42.             curArr.add(1 << n);
  43.         time = new boolean[pow[n] * n + 1];
  44.         ArrayList<Integer> times = new ArrayList<Integer>();
  45.         times.add(0);
  46.         time[0] = true;
  47.         gen(curArr, times);
  48.         ArrayList<Integer> ans = new ArrayList<Integer>();
  49.         for (int i = 0; i <= pow[n] * n; i++)
  50.             if (time[i])
  51.                 ans.add(i);
  52.         for (int i = 0; i < ans.size() - 1; i++)
  53.             out.print(ans.get(i) + ", ");
  54.         out.print(ans.get(ans.size() - 1));
  55.     }
Advertisement
Add Comment
Please, Sign In to add comment