题意
给出一个数x以及变换,可以变成2x,或者变成2x+1,或者不变,变化可以操作若干次
现在给你n个不同的数Y,你需要找到n个不同的x,使得这n个不同的x经过变化之后,能够得到Y数组,并使得X中数的最大值最小。问你应该怎么做。
题解:
每次取最大的数,然后使最大数变小即可,能变就变,用一个set去维护就好了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
struct cmp
{
bool operator()(int x,int y)
{
return x>y;
}
};
int main()
{
int n;
set<int,cmp> cnt;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int p;
scanf("%d",&p);
cnt.insert(p);
}
while(1)
{
int p=*cnt.begin();
while(p)
{
p/=2;
if(cnt.find(p)==cnt.end()&&p!=0)
{
cnt.erase(cnt.begin());
cnt.insert(p);
break;
}
}
if(p==0) break;
}
for(int i=1;i<=n;i++)
{
printf("%d ",*cnt.begin());
cnt.erase(cnt.begin());
}
return 0;
}