D. Marcin and Training Camp

Posted meanttobe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Marcin and Training Camp相关的知识,希望对你有一定的参考价值。

题目链接:http://codeforces.com/contest/1230/problem/D

D. Marcin and Training Camp

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  

 

以上是关于D. Marcin and Training Camp的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #588 (Div. 2) D. Marcin and Training Camp(思维)

Codeforces1598 D. Training Session(思维,组合)

Educational Codeforces Round 115 (Rated for Div. 2) D. Training Session(容斥,思维)

Educational Codeforces Round 115 (Rated for Div. 2) D. Training Session(容斥,思维)

D. Kuro and GCD and XOR and SUM

2017.8.10 ms solution sharing and training