• CodeForces


    题意

    https://vjudge.net/problem/CodeForces-1230D

    要组建一个小组,要求小组中每个人都不比所有人强,当一个人懂得一个算法但是另一个不懂那么前者认为他比后者强。所以这个小组要满足一个人懂得算法必定有另一个人全懂。每个人的技能是不同的,要求出这个小组能组成的技能最大值。

    思路

    先遍历一遍,用map记录a[i](会的算法)的个数,出现次数大于等于2的a[i],是肯定可以放到小组里的,因为有人和他的懂的相同。

    然后对出现次数小于2的人,和刚才确定的人的对比,如果他的能力大于确定的人,那么肯定不行,因为他会的有的东西其他人都不会;如果他的能力小于确定的人,而且(x&y)==x,x是他,y是确定的人,这个式子就表示了x会的算法确定的人里也会,所以可以加入到小组里。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define inf 0x3f3f3f3f
    #define ll long long
    const int N=200005;
    const int mod=1e9+7;
    const double eps=1e-8;
    const double PI = acos(-1.0);
    #define lowbit(x) (x&(-x))
    int n;
    ll a[N],b[N];
    vector<ll> ans;
    map<ll,ll> mp;
    int main()
    {
        std::ios::sync_with_stdio(false);
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            mp[a[i]]++;
        }
        ll res=0;
        for(int i=1;i<=n;i++)
        {
            cin>>b[i];
            if(mp[a[i]]>=2)
                ans.push_back(i),res+=b[i];
        }
        for(int i=1;i<=n;i++)
        {
            if(mp[a[i]]<2)
            {
                for(int j:ans)
                {
                    if(a[i]<a[j]&&((a[i]&a[j])==a[i]))
                    {
                        res+=b[i];
                        ans.push_back(i);
                        break;
                    }
                }
            }
        }
        cout<<res<<endl;
        return 0;
    }
    

      

  • 相关阅读:
    std::sort运行出core(segment fault)
    C++编译报错:重复定义
    《改变世界的九大算法》读书笔记
    简单排序实现
    Django 常见错误总结
    python 进行机器学习
    python中matplotlib 的简单使用
    十四:生成器函数和迭代器函数
    十三:装饰器函数
    十二:重要的内置函数
  • 原文地址:https://www.cnblogs.com/mcq1999/p/11989717.html
Copyright © 2020-2023  润新知