D. Marcin and Training Camp
題目鏈接:http://codeforces.com/contest/1230/problem/D
time limit per test:
3 seconds
memory limit per test:
256 megabytes
input:
standard input
output:
standard output
題目大意:
要組建一個小組,要求小組中每個人都不比所有人強,當一個人懂得一個算法但是另一個不懂那么前者認為他比后者強。所以這個小組要滿足一個人懂得算法必定有另一個人全懂。每個人的技能是不同的,要求出這個小組能組成的技能最大值。
解題思路:
這個小組懂得最多算法的那個人必定有另一個人與他懂的算法一樣。所以記錄所有ai相同的人的ai。可以知道,當一個人比另一個人的ai小且他們的與運算等於小的那個人的ai那么可以知道大的那個人必定強於ai小的那個人。也就是ai小的那個人會的算法另一個人都會。知道了小組中必定有哪些人那么用其他人和這些人比較就可以得到最后小組有哪些人。
代碼:
1 #include <bits/stdc++.h>
2 using namespace std; 3 typedef long long ll; 4 const int N=1e5; 5 ll arr1[N]; 6 ll arr2[N]; 7 ll vis[N]; 8 map<ll,ll>cnt; 9 vector<ll >arr; 10 int main(){ 11 ll n,l; 12 ll ans=0; 13 cin>>n; 14 for(int i=0;i<n;i++){ 15 scanf("%lld",arr1+i); 16 cnt[arr1[i]]++; 17 } 18 for(int i=0;i<n;i++){ 19 scanf("%lld",arr2+i); 20 if(cnt[arr1[i]]>=2){ 21 vis[i]=1; 22 arr.push_back(arr1[i]); 23 ans=ans+arr2[i]; 24 } 25 } 26 for(int i=0;i<n;i++){ 27 if(vis[i]==0){ 28 l=arr.size(); 29 for(int j=0;j<l;j++){ 30 if(arr1[i]<arr[j]&&((arr1[i]&arr[j])==arr1[i])){ 31 arr.push_back(arr1[i]); 32 ans=ans+arr2[i]; 33 break; 34 } 35 } 36 } 37 } 38 cout<<ans<<endl; 39
40
41 return 0; 42 }
