NC207569 牛牛爱奇数
题目
题目描述
在牛牛面前放着 个数,这些数字既有奇数也有偶数,只不过牛牛对奇数情有独钟,他特别想让这些数都变成奇数。
现在牛牛获得了一种能力,他可以执行一种操作:每次选中一个偶数,然后把这些数中与该数相等的数都除以 ,例如现在有一个数组为 ,那么牛牛可以执行一次操作,使得这个数组变为 。
牛牛现在想知道,对于任意的 个数,他最少需要操作多少次,使得这些数都变成奇数?
示例1
输入
3,[2,2,3]
返回值
1
说明
只需做一次操作,会将其中的偶数 都变成 ,满足了所有的数都是奇数的要求。
示例2
输入
3,[1,3,7]
返回值
0
说明
不需要做任何操作,因为所有的数原本就是奇数。
备注
,代表一个有多少数字
代表数字的大小
对于 的数据,
对于 的数据,
对于 的数据,
题解
知识点:贪心,STL,优先队列。
先把偶数放进优先队列从大到小排,因为大的偶数可能变成已有的小偶数,用小偶数除一次即可,因此从大的偶数开始除。并且因为同一个数字只要除一次,所以把一个除完的数字放回队列即可,剩下的同种数字全部弹出。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n; cin >> n; priority_queue<int> pq; for (int i = 0, tmp;i < n;i++) { cin >> tmp; if (!(tmp & 1)) pq.push(tmp); } int ans = 0; while (!pq.empty()) { ans++; int x = pq.top(); while (!pq.empty() && pq.top() == x) pq.pop(); x >>= 1; if (!(x & 1)) pq.push(x); } cout << ans << '\n'; return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16461323.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧