CF722D Solution
题解
因为只需关注最大值,所以每次使最大值\(/2\),如果已有此值则继续\(/2\)直至出现不在\(x\)中的值,如果全部在\(x\)中则现在的序列\(x\)即为最优方案。设当前\(x\)中最大值为\(a\),不断进行\(a/2\)得出的数为\(b\),因为\(b/2\)得出的数\(a/2\)也可以得出,不存在对非最大值进行操作可以使结果发生变化的情况。找最大值与判断是否在\(x\)中可以使用优先队列和map。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=50010;
int y[N],x[N];
map<int,bool> mp;
priority_queue<int> q;
int main()
{
int n,tp,qwq;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&y[i]);
for(int i=1;i<=n;i++) mp[y[i]]=1,q.push(y[i]);
while(!q.empty())
{
tp=q.top(); q.pop();
qwq=tp; tp>>=1;//最后一个队首不应出队,因此用qwq记录输出
while(mp[tp] && tp) tp>>=1;
if(!tp) break;
mp[tp]=1,q.push(tp);
}
while(!q.empty()) {printf("%d ",q.top()); q.pop();}
printf("%d",qwq);
return 0;
}