题目解析
n<1e5,采取用暴力的方法来做
我们考虑a[i]和Min的关系
如果通过除以2的操作使a[i]==Min
那么直接不停比较,如果a[i]大,那就a[i]减半并且cnt+=1;
如果a[i]小,那就Min减半并且cnt+=numMin;(现在值为Min的个数)-->
为什么加的是numMin呢?
因为对于已经遍历过的且最后值为Min的元素都需要再除二,因此要全部算上;
如果a[i]==Min,那么退出循环
最后输出cnt即可
代码
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl "\n"
#define PII pair<int,int>
#define PIII pair<int,PII>
const int MOD = 1e9 + 7;
const int N = 3e5;
void slu() {
int n;
cin >> n;
int Min = INT_MAX;
int numMin = 1;
int cnt = 0;
int Minloc = 0;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
if (Min > a[i]) {
Min = a[i];
Minloc = i;
}
}
for (int i = 0; i < n; i++) {
if (i == Minloc)continue;
else {
while (a[i] > Min) {
a[i] /= 2;
cnt++;
}
while (a[i] != Min) {
if (a[i] > Min) {
a[i] /= 2;
cnt++;
} else if (a[i] < Min) {
Min /= 2;
cnt += numMin;
}
}
numMin++;
}
}
cout << cnt;
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T;
// cin >> T;
T = 1;
while (T--)slu();
}

京公网安备 11010502036488号