题目地址:这里
题意:一个数x,可以变成2x,或者变成2x+1,可以变化若干次。现在给你n个不同的数Y,你需要找到n个不同的x,使得这n个不同的x经过变化之后,能够得到Y数组,你要使得最初的最大值最小。问你应该怎么做。
解法:贪心,每次选择最大的数,然后使得最大数变小即可,能变就变,用一个set去维护就好了。
//CF 722D
#include <bits/stdc++.h>
using namespace std;
set <int> s;
int n;
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++){
int x;
scanf("%d", &x);
s.insert(-x);
}
while(1){
int x = -*s.begin();
int k = *s.begin();
x /= 2;
while(x){
if(s.find(-x) == s.end()){
s.insert(-x);
break;
}
x/=2;
}
if(x == 0){
for(auto it : s){
cout << -it << " ";
}
cout << endl;
return 0;
}
s.erase(k);
}
}