zoukankan      html  css  js  c++  java
  • 寻找最大值

    寻找最大值

    时间限制:10000ms
    单点时限:1000ms
    内存限制:256MB

    描述

    给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大。其中AND是按位与操作。  

    小Ho当然知道怎么做。现在他想把这个问题交给你。

    输入

    第一行一个数T,表示数据组数。(1 <= T <= 10)  

    对于每一组数据:

    第一行一个整数N(1<=N<=100,000)

    第二行N个整数A1, A2, A3, ... AN (0 <= Ai <220)

    输出

    一个数表示答案

    样例输入
    2
    3
    1 2 3
    4
    1 2 4 5
    样例输出
    12
    80
    分析:高维前缀和思想,维护最大值与次大值;
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <bitset>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <cassert>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define vi vector<int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    #define pii pair<int,int>
    #define sys system("pause")
    const int maxn=1e5+10;
    const int N=2e5+10;
    using namespace std;
    int id(int l,int r){return l+r|l!=r;}
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p%mod;p=p*p%mod;q>>=1;}return f;}
    int n,m,k,t,cnt[1<<20],ma[1<<20],mi[1<<20];
    int main()
    {
        int i,j;
        scanf("%d",&t);
        while(t--)
        {
            memset(cnt,0,sizeof(cnt));
            memset(mi,0,sizeof(mi));
            memset(ma,0,sizeof(ma));
            scanf("%d",&n);
            rep(i,1,n)scanf("%d",&j),cnt[j]++;
            rep(i,0,(1<<20)-1)
            {
                if(cnt[i]>=1)ma[i]=i;
                if(cnt[i]>=2)mi[i]=i;
            }
            for(i=0;i<20;i++)
            {
                for(j=0;j<(1<<20);j++)
                {
                    if((~j)&(1<<i))
                    {
                        if(ma[j^(1<<i)]>ma[j])
                        {
                            mi[j]=ma[j];
                            ma[j]=ma[j^(1<<i)];
                        }
                        if(mi[j^(1<<i)]>mi[j])mi[j]=mi[j^(1<<i)];
                    }
                }
            }
            ll ret=0;
            rep(i,0,(1<<20)-1)ret=max(ret,(ll)ma[i]*mi[i]*i);
            printf("%lld
    ",ret);
        }
        return 0;
    }
  • 相关阅读:
    ASP.NET Web API 记录请求响应数据到日志的一个方法
    EF删除集中方法对比
    CSS 的优先级机制[总结]
    sql备份命令
    sql两张表关联更新字段
    VSCode隐藏node_modules目录
    C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic
    模拟退火(转)
    HNOI2006-鬼谷子的钱袋
    HNOI2006-公路修建问题(二分答案+并查集)
  • 原文地址:https://www.cnblogs.com/dyzll/p/6666434.html
Copyright © 2011-2022 走看看