Generating Sets 贪心
Posted LuZhiyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Generating Sets 贪心相关的知识,希望对你有一定的参考价值。
题意:
n个数的数组y[1~n],每个数各不相同,求一个每个数各不相同的x数组x[1~n],使得x中的数经过若干次两种操作变成y数组。操作:x[i]=2*x[i],x[i]=2*x[i]+1;
求最大值最小的一个x数组。
代码:
//优先队列+map,将y数组存入优先队,用map标记每个y[i]是否在优先队列中, //每次取最大的一个y[i],看队列中有没有y[i]/2,没有就加入y[i]/2,除去y[i], //如果有再看y[i]/2/2有没有.....直到除到1,队列中还有1就说明不能再减小了。 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> #include<map> using namespace std; int a[50004]; map<int,int>mp; struct cmp{ bool operator () (int &a,int &b){ return a<b; } }; int main() { int n,x; scanf("%d",&n); priority_queue<int,vector<int>,cmp>q; for(int i=0;i<n;i++){ scanf("%d",&x); mp[x]=1; q.push(x); } mp[0]=1; while(1){ int x=q.top(); while(x>0){ if(mp[x/2]) x/=2; else{ mp[x/2]=1; q.push(x/2);q.pop(); break; } } if(x==0) break; } printf("%d",q.top());q.pop(); while(!q.empty()){ printf(" %d",q.top()); q.pop(); } printf("\n"); return 0; }
以上是关于Generating Sets 贪心的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 722D Generating Sets
CodeForces 722D Generating Sets
[codeforces722D]Generating Sets
UVA11925-Generating Permutations(贪心)