题解 | #游游的除2操作#
游游的除2操作
https://www.nowcoder.com/practice/b797f46aa75145a0bbe112099f7cbd18
#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; if (n == 1) { cout << 0; return 0; } int temp; vector<int> vec; for (int i = 0; i < n; ++i) { cin >> temp; vec.push_back(temp); } int size = 1; int sum = 0; for (int i = 0; i < n - 1; ++i) { while (vec[i] != vec[i + 1]) { if (vec[i] > vec[i + 1]) { vec[i] = vec[i] >> 1; sum = sum + size; } else { vec[i + 1] = vec[i + 1] >> 1; ++sum; } } ++size; } cout << sum << endl; } // 64 位输出请用 printf("%lld")
将所有的数保存下来;
从头到尾两两比较,除以2,使其相等。
在循环的同时,记录下之前有多少个数字相同,
比如2 2 2 2 1 比较到2 和 1时,应该是2 / 2一次变化,但是前面已经有4个数相同了,所以变化实际需要进行4次。
如果是 1 1 1 1 2,只需要一次。
所以就是在两两比较时,分情况,
这样,遍历到最后时间复杂率是On。