题意:E、Maximum Subsequence Value
题意:
给你n 个元素,你挑选k个元素,那么这个 k 集合的值为 ∑2i,其中,若集合内至少有 max(1,k−2)个数二进制下第 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 */