Codeforces 1426c

小小白一个,开始尝试写博客,请多多指教(-。-")。

[https://codeforces.com/contest/1426/problem/C](C. Increase and Copy)

题目大意:
对一个初始数组{1}进行两种操作:
1.将其中任意一个元素加一;
2.复制一个元素添加到数组末尾。
求使数组元素之和大于等于n的最小操作数。

做这道题时看到有二分的标签,就用二分做了。
首先对于每种操作数,都可以得到一个最大数并计算出来,操作方法是前一半操作使初始数组中的1一直加一,后一半操作一直复制。
既然知道了每种操作数可以得到的最大值那么接下来就可以利用二分做了。

#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;

ll getmax(int n) //得到每种操作数可以得到的最大值
{
    ll x = n / 2 + 1;     //加一操作
    x += (n + 1) / 2 * x; //复制操作
    return x;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n, mid = 1;
        cin >> n;
        int l = 0, r = n - 1;
        while (l + 1 < r)
        {
            mid = (l + r) >> 1;
            ll temp = getmax(mid);
            if (temp >= n)
                r = mid;
            else
                l = mid;
        }
        cout << r << endl;
    }
    return 0;
}

posted @ 2020-11-01 12:15  wannli  阅读(92)  评论(0)    收藏  举报