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;
}
posted @ 2021-03-13 18:27  violet_holmes  阅读(48)  评论(0编辑  收藏  举报