题目解析

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();

}