首页 > 其他 > 详细

CF722D Solution

时间:2021-03-14 00:27:43      阅读:40      评论:0      收藏:0      [点我收藏+]

题目链接

题解

因为只需关注最大值,所以每次使最大值\(/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;
}

CF722D Solution

原文:https://www.cnblogs.com/violetholmes/p/14529903.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!