CF1883E Look Back
思路要点:
对于第i - 1个和第i个数字,利用第i-1个数字乘以的2x,在此基础之上再进行多乘或者少乘使得第i个数字足以大于等于第i-1个数字,由此可以得到最小的步骤数(本质上也就是前缀和)
#include <iostream>
#define int long long
using namespace std;
int a;
void solve()
{
int n, la, sum = 0, ans = 0;
cin >> n >> la;
for (int i = 1;i < n;i ++)
{
cin >> a;
int cnt = 0;
int l = la, r = a;
while (l < r) l *= 2, cnt --; // 少乘几个2
while (l > r) r *= 2, cnt ++; // 多乘几个2
//cnt即为,在l处理过的基础上,少乘几次(或者多乘几次)就能使得r >= l
sum += cnt; //在前面的基础上(保证相邻两个数比值不变时),需要乘多少次
sum = max(0ll, sum);
ans += sum;
la = a;
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0);
int t;
cin >> t;
while (t --) solve();
return 0;
}

浙公网安备 33010602011771号