codeforces722D
来源:互联网 发布:淘宝网姓名贴 编辑:程序博客网 时间:2024/06/06 15:41
题意:
给定一个集合Y,集合Y有一些1e9以内的正整数组成,求一个集合X,拥有和集合Y一多的元素,每一个在X集合 中的元素可以*2或者*2+1,且 进行任意次操作之后变为Y集合,求一种X集合使得X集合中的最大值最小
思路:
分析后,就是一个二叉树的问题;
解法一:直接暴力,n是5e4,a是1e9 ,最多也就30层,完全没问题,但怎么暴力呢,
可以用一个优先队列维护, 不断放缩队列里最大的值,直至不能放缩。
二: 可以用二分的方法,每次检查mid, 找到最小的mid即可。
#include<iostream>#include<algorithm>#include<string>#include<cmath>#include<vector>#include<set>#include<map>#include<stack>#include<queue>#include<cstdio>#include<cstring>#define ll long longusing namespace std;const int maxn = 5e4 +10;int a[maxn];priority_queue<int> q;map<int,int> mp;int b[maxn];int main(){ int n; scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); q.push(a[i]); mp[a[i]] = 1; } while( !q.empty() ) { int now = q.top(); int f = now; while(mp[now] && now!=0) { now /= 2; } if(now==0) { break; } mp[f] = 0; mp[now] = 1; q.pop(); q.push(now); } while(!q.empty()) { printf("%d ",q.top()); q.pop(); } return 0;}
阅读全文
0 0
- codeforces722d
- codeforces722D
- Codeforces722D-Generating Sets(set + 二分答案)
- Linux文件编程
- (Boolan)C++设计模式 <九> ——单例模式(Singleton)和享元模式(FlyWeight)
- (Boolan)C++设计模式 <十> ——状态模式(State)和备忘录(Memento)
- (Boolan)C++设计模式 <十一> ——组合模式(Composite)、迭代器(Iterator)和责任链(Chain of Resposibility)
- (Boolan)C++设计模式 <十二> ——命令模式(Command)和访问器(Visitor)
- codeforces722D
- (Boolan)C++设计模式 <十三> ——解析器(Interpreter)
- POJ 2689:Prime Distance
- Linux嵌入式开发入门(一)——初探嵌入式开发板的基本使用
- 安卓蓝牙流程
- Linux嵌入式开发入门(二)——快速看懂原理图,对接软件开发
- 嵌入式Linux驱动开发(二)——字符设备驱动之控制LED
- C++ usage of fstream
- 嵌入式Linux开发——裸板程序点亮开发板上的LED灯