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;
    }
  • 相关阅读:
    快速上手php:使用PhpStrom调试php
    快速上手php:使用PhpStrom部署项目
    使用自定义tld标签简化jsp的繁琐操作
    京东购物体验杂谈
    Mysql将近两个月的记录合并为一行显示
    学习WebSocket(二):使用Spring WebSocket做一个简单聊天室
    学习WebSocket(一):Spring WebSocket的简单使用
    springMVC的@ResponseBody、@RequestBody使用需要注意的地方
    如何使用maven建一个web3.0的项目
    项目管理工具 Redmine 安装试用手记
  • 原文地址:https://www.cnblogs.com/dyzll/p/6666434.html
Copyright © 2011-2022 走看看