• 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;
    }
    
  • 相关阅读:
    css3 省略号
    js一些常用方法
    nth-child使用
    常见表单元素处理
    表单的基本使用
    web基本概念
    PHP数组
    PHP函数
    PHP错误处理
    PHP文件载入
  • 原文地址:https://www.cnblogs.com/violetholmes/p/14529903.html
Copyright © 2020-2023  润新知