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); }
Leave A Comment