堆——洛谷 P1323 删数问题

来源:互联网 发布:重庆网络运营推广 编辑:程序博客网 时间:2024/06/17 20:00

https://www.luogu.org/problem/show?pid=1323
对于集合元素的求法,我们可以大力queue
直接建一颗小根堆;
对于最后求答案,那么直接贪心就好了;
大力找到第一个递增序列,删掉第一个元素

#include<bits/stdc++.h>#define Ll long longusing namespace std;priority_queue<Ll ,vector<Ll >,greater<Ll > >Q;Ll a[100],ll;int v[3000000],top;Ll n,m,k,l;char c[3000000];bool b[3000000];int main(){    scanf("%lld%lld",&n,&m);    Q.push(1);    while(n--){        Ll x=Q.top();Q.pop();         Q.push(x*2+1);        Q.push(x*4+5);        for(;x;x=x/10)a[++ll]=x%10;        while(ll)c[++l]=char(a[ll--]+48);    }    for(Ll i=1;i<=l;i++)printf("%c",c[i]);cout<<endl;     for(int i=1;i<=l&&m;i++){        while(top&&m&&c[v[top]]<c[i])b[v[top--]]=1,m--;        v[++top]=i;    }    for(Ll i=1;i<=l;i++)if(!b[i])printf("%c",c[i]);}
原创粉丝点击