CF1277B
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';
}