题解 | #游游的除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。
查看8道真题和解析