Codeforces Round #312 (Div. 2) C. Amr and Chemistry

原题:http://codeforces.com/problemset/problem/558/C


题目大意: 给一个数组, 可以对每个数进行两个操作, *2 或者 /2. 每次操作算一步, 问一共多少步能让数组所有数都相同.


分析: 下面的code是答案, 我写的太复杂了. 一看答案那么短, 真是跪了. 答案的思路是BFS, 然后也没有什么技巧. 就是暴啊. 而且是全局暴.. 我自己的code还左移右移的写了一大堆.

 public void solve(int testNumber, InputReader in, OutputWriter out) {
        int n = in.readInt();
        int[] count = new int[100010];//记录从i点能走到其他点的总数
        int[] visit = new int[100010];//防止环
        int[] steps = new int[100010];//记录从i点走了多少步到其他点
        int res = Integer.MAX_VALUE;

        for (int i = 1; i <= n; i++) {
            int num = in.readInt();
            Queue<IntPair> queue = new LinkedList<>(); //<数字,步数>
            queue.add(new IntPair(num, 0));
            while (!queue.isEmpty()) {
                IntPair pair = queue.poll();
                if (pair.first > 100001)
                    continue;
                if (visit[pair.first] == i)
                    continue;
                visit[pair.first] = i; 
                count[pair.first] ++;
                steps[pair.first] += pair.second;//记录一下步数
                queue.add(new IntPair(pair.first*2, pair.second+1));
                queue.add(new IntPair(pair.first/2, pair.second+1));
            }
        }
        for (int i = 0 ; i < 100010; i++) {
            if (count[i] == n)
                res = Math.min(res, steps[i]);
        }
        out.print(res);

    }