Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void precalc(int n) {
- pow = new int[n + 1];
- pow[0] = 1;
- for (int i = 1; i <= n; i++)
- pow[i] = 3 * pow[i - 1];
- ArrayList<Integer> curArr = new ArrayList<Integer>();
- for (int i = 0; i < n; i++)
- curArr.add(1 << n);
- time = new boolean[pow[n] * n + 1];
- ArrayList<Integer> times = new ArrayList<Integer>();
- times.add(0);
- time[0] = true;
- gen(curArr, times);
- ArrayList<Integer> ans = new ArrayList<Integer>();
- for (int i = 0; i <= pow[n] * n; i++)
- if (time[i])
- ans.add(i);
- for (int i = 0; i < ans.size() - 1; i++)
- out.print(ans.get(i) + ", ");
- out.print(ans.get(ans.size() - 1));
- }
- void gen(ArrayList<Integer> length, ArrayList<Integer> times) {
- if (length.size() == 0) {
- for (int i = 0; i < times.size(); i++) {
- for (int j = i + 1; j < times.size(); j++)
- time[times.get(j) - times.get(i)] = true;
- }
- return;
- }
- for (int mask = 1; mask < pow[length.size()]; mask++) {
- int minTime = Integer.MAX_VALUE;
- for (int i = 0; i < length.size(); i++) {
- int maskI = (mask / pow[i]) % 3;
- if (maskI == 1)
- minTime = Math.min(minTime, length.get(i));
- if (maskI == 2)
- minTime = Math.min(minTime, length.get(i) / 2);
- }
- ArrayList<Integer> newLength = new ArrayList<Integer>();
- for (int i = 0; i < length.size(); i++) {
- int maskI = (mask / pow[i]) % 3;
- int nextLen = length.get(i);
- if (maskI == 1)
- nextLen -= minTime;
- if (maskI == 2)
- nextLen -= 2 * minTime;
- if (nextLen != 0)
- newLength.add(nextLen);
- }
- times.add(times.get(times.size() - 1) + minTime);
- gen(newLength, times);
- times.remove(times.size() - 1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment