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;
}
posted @ 2024-12-09 10:06  windfallll  阅读(18)  评论(0)    收藏  举报