zoukankan      html  css  js  c++  java
  • 找丑数

    额,刚开始比较naive,直接用stl大法,结果T了

    #pragma GCC optimize(2)
    #include<cstdio>
    #include<iostream>
    #include<queue>
    #include<set>
    #include<vector>
    #define ll long long
    using namespace std;
    ll n,m,val,zhi,tot,ce[123123];
    priority_queue <ll , vector <ll> , greater<ll> > q;
    set <ll> s;
    int main(){
        scanf("%lld%lld",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&val);
            ce[i] = val;
            s.insert(val);
            q.push(val);
        }
        while(1)
        {
             val = q.top();
             q.pop();
             tot++;
             if(tot == m)
             {
                 cout << val;
                 return 0;
             }
             for(int i=1;i<=n;i++)
             {
                 zhi = val * ce[i];
                 if(!s.count(zhi))
                 {
                     s.insert(zhi); 
                     q.push(zhi); 
                }
             }
        }
        
    }

    然后把优先队列改成手写堆,set该做map,继续T。。。QAQ。。。

    #pragma GCC optimize(2)
    #include<cstdio>
    #include<map>
    #define ll long long
    using namespace std;
    ll n,m,val,zhi,tot,ce[1231203];
    ll dui[1001000];
    map <ll,int> s;
    
    inline void insert(ll val)
    {
        dui[++tot] = val;
        ll k = tot;
        while(k > 1 && dui[k] < dui[k >> 1])
        {
            swap(dui[k] , dui[k >> 1]);
            k >>= 1;
        }
    }
    
    inline void del()
    {
        dui[1] = dui[tot--];
        bool k;
        ll p = 1;
        while(p * 2 <= tot)
        {
            if(p * 2 == tot) k = 0;
            else k = dui[p << 1] > dui[p << 1 | 1] ? 1 : 0;
            if(dui[p] > dui[p * 2 + k])
            {
                swap(dui[p] , dui[p * 2 + k]);
                p = p * 2 + k;
            }
            else break;
        }
    }
    
    int main(){
        scanf("%lld%lld",&n,&m);
        
        for(int i=1;i<=n;++i)
        {
            scanf("%lld",&val);
            ce[i] = val;
            insert(val);
            s[val] = 1;
        }
        
        for(int j=1;j <= m;++j)
        {
            if(j == m)
            {
                printf("%lld",dui[1]);
                return 0;
            }
            val = dui[1];
            del();
            for(int i=1;i<=n;++i)
            {
                zhi = val * ce[i];
                if(!s.count(zhi))
                {
                    insert(zhi);
                    s[zhi] = 1;
                }
            }
        }
    }

    最后做了一些操作就可以过了,不过很妙啊,看看代码应该就懂了吧。

    #include<cstdio>
    #include<algorithm>
    #define ll long long
    using namespace std;
    ll n,m,val,zhi,tot,ce[131203];
    struct st{
        ll val;
        int ji;
    }dui[8001000];
    
    inline void insert(st t)
    {
        dui[++tot] = t;
        ll k = tot;
        while(k > 1 && dui[k].val < dui[k >> 1].val)
        {
            swap(dui[k] , dui[k >> 1]);
            k >>= 1;
        }
    }
    
    inline void del()
    {
        dui[1] = dui[tot--];
        bool k;
        ll p = 1;
        while(p * 2 <= tot)
        {
            if(p * 2 == tot) k = 0;
            else k = dui[p << 1].val > dui[p << 1 | 1].val ? 1 : 0;
            if(dui[p].val > dui[p * 2 + k].val)
            {
                swap(dui[p] , dui[p * 2 + k]);
                p = p * 2 + k;
            }
            else break;
        }
    }
    
    int main(){
        scanf("%lld%lld",&n,&m);
        
        for(int i=1;i<=n;++i)
        {
            scanf("%lld",&val);
            ce[i] = val;
            st a;
            a.val = val;
            a.ji = i;
            insert(a);
        }
        
        for(int j = 1;j <= m;++j)
        {
            if(j == m)
            {
                printf("%lld",dui[1].val);
                return 0;
            }
            val = dui[1].val;
            int ka = dui[1].ji;
            del();
            for(int i=ka;i<=n;++i)
            {
                zhi = val * ce[i];
                st a;
                a.val = zhi;
                a.ji = i;
                insert(a);
            }
            
        }
    }

  • 相关阅读:
    基础才是重中之重~stream和byte[]的概念与转化
    微信扫码i支付~官方DEMO的坑
    知方可补不足~SqlServer自动备份数据库及清理备份文件
    11g r2 模拟OCR和voting disk不可用,完整恢复过程,以及一些注意事项
    自定义navigationBar的高度
    Python 中的用户自定义类型
    hdu1370-Biorhythms
    Ruby on Rails 實戰聖經阅读(三)
    重新配置与卸载 11gR2 Grid Infrastructure
    非确定有限状态自动机的构建(一)——NFA的定义和实现
  • 原文地址:https://www.cnblogs.com/kczno1fans/p/7685011.html
Copyright © 2011-2022 走看看