• 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 */
  • 相关阅读:
    取三级分销上下级用户id
    Map集合
    Log4j
    异常
    逻辑运算符
    变量
    变量名命名规则
    命名法
    Nessus
    Nmap扫描工具
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/13320663.html
Copyright © 2020-2023  润新知