CF1277B

in luogu

in codeforces

Solution

可以发现,对于奇数,我们可以不用管。而对于偶数,进行数次操作后,最后都会变成 \(1\)

一种类似贪心的思路。

我们可以每次从序列中取出最大的数(我们将大的数化成小的数后,与小的数一起修改,这样不会有多余的操作,是最优的),将与它相同的数也一并取出,然后除以 \(2\) 再放回序列,直到序列里全都是奇数为止。

每次要从序列中取出最大值,还要把数放回序列,容易想到用优先队列来实现。

核心代码:

void solve()

{
	cin >> n;
	priority_queue <int> q;
	for (int i = 1; i <= n; i ++ ) 
	{
		cin >> d[i];
		q.push(d[i]);
	}
	int cnt = 0;
	while (!q.empty())
	{
		int top = q.top();
		q.pop();
		if (top % 2) continue;//奇数跳过 
		q.push(top >> 1);
		cnt ++;//操作数 + 1 
		while (!q.empty() && q.top() == top) q.pop(), q.push(top >> 1);//判断相同的数 
	}
	cout << cnt << '\n';
}
posted @ 2023-07-19 07:55  恋暗  阅读(93)  评论(0)    收藏  举报