题目解析
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(); }