大体题意:
给你长度为n 的数组y,求一个数组x,满足y中的每一个元素都可以由x中的元素 进行乘以2 或者 乘以2加1 的操作来得到!要求输出x中的最大元素尽可能小的结果?
思路:
比赛没有出,赛后补的!
贪心思路:
先把刚开始的数放到set里,不断取出最大值,然后给当前最大值找到第一个合适的数,不断的找,不断的处理,直到当前最大值不能在小了,结束循环!
这种贪心相当于每一步都找到最大值,每一次 都给最大值 优化一步!
#include <bits/stdc++.h>
using namespace std;
set<int>s;
set<int>::iterator it;
int main(){
int n;
scanf("%d",&n);
for (int i = 0; i < n; ++i){
int x;
scanf("%d",&x);
s.insert(x);
}
while(1){
int x = *s.rbegin();
s.erase(x);
int val = x/2;
bool ok = 0;
while(1){
if(val == 0)break;
if (val && !s.count(val)){
ok = 1;
s.insert(val);
break;
}
val/=2;
}
if (!ok){
s.insert(x);
break;
}
}
for (it = s.begin(); it != s.end(); ++it){
if (it != s.begin())printf(" ");
printf("%d",*it);
}
puts("");
return 0;
}