題意
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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/117867.html
標籤:其他
上一篇:給你講清楚什么是檔案上傳漏洞
下一篇:應該如何刷 LeetCode?
