CF-Round #633-div2-C题

CF-Round #633-div2-C题

C. Powered Addition

传送门

这道题是关于二进制的贪心题。

题目大意:给你一个序列,让你在第x秒可以对任意区间中的所有数据+2^(x - 1);问最少需要多少秒才可以使得这个序列是非递减的。

贪心策略:我们可以从后往前跑一遍这个序列,在这个过程中每次维护最小值,并且维护最小值与后面的数之间差的最大值。这两者之间的顺序没有必然的先后关系~我们最后得到了这个最大的差值,意味着把这个差值填补上,其余的也全部填补上了。
现在只需要计算这个差值最少需要多少秒了。
因为是累加型,并且关系到2,我们很容易联想到二进制~
所以我们只需要把这个最大的差值转化为二进制,然后看哪些位数上面是1,在对应的秒数上操作就行,所以我们这里只需要取到最高位的1(这个操作只需要取对数即可~),然后再+1就是我们最少需要的秒数了(因为是第x秒加上2^(x - 1)嘛)

注意:log2(x)返回的是double类型。需要强转,(有可能不为整数)

代码部分:

#include 
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;

int n;
ll a[N];

int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		scanf ("%d", &n);
		for (int i = 1; i <= n; i++)
		{
			scanf ("%I64d", &a[i]);
		}
		ll minn = a[n];
		ll cnt = 0;
		for (int i = n - 1; i >= 1; i--)
		{
			if (a[i] < minn)
			{
				minn = a[i];
			}
			if (a[i] - minn > cnt)
			{
				cnt = a[i] - minn;
			}
		}
		if (!cnt)
		{
			cout << "0\n";
		}
		else
		{
			cout << (int)log2(cnt) + 1 << endl;
		}
	}
	return 0;
}

你可能感兴趣的:(二/四进制,贪心)