Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value 贪心

Posted kongbursi-2292702937

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value 贪心相关的知识,希望对你有一定的参考价值。

题意:E、Maximum Subsequence Value

 

题意:

给你n 个元素,你挑选k个元素,那么这个 k 集合的值为 2i,其中,若集合内至少有 max(1,k2)个数二进制下第 i 位为 1,则第 i 位有效,求一个集合可以得到的最大值。

 

题解:

应该是一种贪心

当k==3的时候,那么也就相当于从n个元素中挑选出来三个数进行或操作即可。如果你选择k==4,那么就相当于在k==3的基础上进行与操作,那么这个结果只会小于等于k==3时候的答案。

k==5之后的也是这样

 

代码:

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string>
 5 #include<queue>
 6 #include<deque>
 7 #include<string.h>
 8 #include<map>
 9 #include <iostream>
10 #include <math.h>
11 using namespace std;
12 typedef long long ll;
13 const int maxn=500+10;
14 ll v[maxn];
15 int main()
16 {
17     ll n,result=0;
18     scanf("%I64d",&n);
19     for(ll i=0; i<n; ++i)
20         scanf("%I64d",&v[i]);
21     if(n==1)
22     {
23         ll ans=v[0],ci=1,sum=0;
24         while(ans)
25         {
26             if(ans&1)
27             {
28                 sum+=ci;
29                 ci*=2;
30             }
31             ans>>=1;
32         }
33         result=max(result,sum);
34         printf("%I64d
",result);
35         return 0;
36     }
37     else if(n==2)
38     {
39         ll ans=v[0]|v[1],ci=1,sum=0;
40         while(ans)
41         {
42             if(ans&1)
43             {
44                 sum+=ci;
45                 ci*=2;
46             }
47             ans>>=1;
48         }
49         result=max(result,sum);
50         printf("%I64d
",result);
51         return 0;
52     }
53 
54     for(ll i=0; i<n; ++i)
55     {
56         for(ll j=i+1; j<n; ++j)
57         {
58             for(ll k=j+1; k<n; ++k)
59             {
60                 ll ans=v[i]|v[j],ci=1,sum=0;
61                 ans=ans|v[k];
62 //                while(ans)
63 //                {
64 //                    if(ans&1)
65 //                    {
66 //                        sum+=ci;
67 //                        ci*=2;
68 //                    }
69 //                    ans>>=1;
70 //                }
71                 result=max(result,ans);
72             }
73         }
74     }
75     printf("%I64d
",result);
76     return 0;
77 }
78 /*
79 10
80 582366931603099761 314858607473442114 530263190370309150 871012489649491233 877068367969362781 671646356752418008 390155369686708364 958695211216189893 919124874293325142 196726357117434998
81 
82 */

 

以上是关于Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value 贪心的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #648 (Div. 2) A-F题解

Codeforces Round #648 (Div. 2)ABCDEF(题解)

Codeforces Round #648 (Div. 2)ABCDEF(题解)

Codeforces Round #648 (Div. 2) (A-F)

Codeforces Round #648 (Div. 2).D Solve The Maze

Codeforces Round #648 (Div. 2) A - Matrix Game