zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    贪心[2019.5.25]
    顺序统计算法[2019.5.25]
    polya/burnside 学习
    虚拟机上装uoj
    一些常用的数据结构维护手法
    发一个数据生成器
    圆方树学习
    四校联考 推冰块
    Codeforces Training S03E01泛做
    HAOI2015 泛做
  • 原文地址:https://www.cnblogs.com/violetholmes/p/14529903.html
Copyright © 2011-2022 走看看