• 问题 H: 抽奖活动(大数)


    题目描述
    zc去参加抽奖活动,在抽奖箱里有n个球,每个球上写着一个数字。一次抽取两个球,得分为两个球上的数的乘积。为了中大奖,zc想要知道他能得到的最大得分为多少。
    输入
    第一行为T,代表样例数。(1<=T<=10)
    其中每组样例,第一个数为n,代表球的数量,接下来n个数s1,s2…,sn,代表球上的数字。(2<=n<=1e5,-4e9<=bi<=4e9)

    输出
    每组样例输出一行,输出一个数,代表zc得到的最大得分。(保证最大得分不小于0)
    样例输入

    2
    3
    1 2 3
    3
    -1 0 1

    样例输出

    6
    0

    AC代码

    #include<cstdio>  
    #include<algorithm>  
    #include<iostream>  
    #include<cstring>  
    using namespace std;  
    typedef long long ll;  
    const int M=100005;  
    ll aa[1005],bb[1005],sum[5000];  
    ll aa1[1005],bb1[1005],sum1[5000];  
    ll a[M];  
    int main()  
    {  
        ll n,T;  
        cin>>T;  
        while(T--)  
        {  
            cin>>n;  
            ll i,j=0,k=0,p=0,l=0,l1=0,l2=0,l3=0,l4=0,lp=0;  
            memset(a,0,sizeof(a));  
            memset(aa,0,sizeof(aa));  
            memset(bb,0,sizeof(bb));  
            memset(sum,0,sizeof(sum));  
            memset(aa1,0,sizeof(aa1));  
            memset(bb1,0,sizeof(bb1));  
            memset(sum1,0,sizeof(sum1));  
            for(i=0;i<n;i++)  
                scanf("%lld",&a[i]);  
            ll Max1=-1,Max2=-1,Min1=0,Min2=0;  
            for(i=0;i<n;i++)  
            {  
                if(Max1<a[i])  
                {  
                    k=i;  
                    Max1=a[i];  
                }  
                if(Min1>a[i])  
                {  
                    p=i;  
                    Min1=a[i];  
                }  
            }  
            for(i=0;i<n;i++)  
            {  
                if(i!=k)  
                {  
                    if(Max2<a[i])  
                        Max2=a[i];  
                }  
                if(i!=p)  
                {  
                    if(Min2>a[i])  
                        Min2=a[i];  
                }  
            }   
                Min1=-Min1;  
                Min2=-Min2;  
                if(Max1==0)  
                    aa[0]=0;  
                if(!Max2)  
                    bb[0]=0;  
                if(Min1==0)  
                    aa1[0]=0;  
                if(Min2==0)  
                    bb1[0]=0;  
                while(Max1)  
                {  
                    aa[l1++]=Max1%10;  
                    Max1/=10;  
                }  
                while(Max2)  
                {  
                    bb[l2++]=Max2%10;  
                    Max2/=10;  
                }  
                for(i=0;i<l1;i++)  
                    for(j=0;j<l2;j++){  
                        sum[i+j]+=aa[i]*bb[j];  
                        l=i+j;  
                }  
                for(i=0;i<l;i++)  
                {  
                    ll w=sum[i];  
                    sum[i]=w%10;  
                    sum[i+1]+=w/10;  
                }  
                while(Min1)  
                {  
                    aa1[l3++]=Min1%10;  
                    Min1/=10;  
                }  
                while(Min2)  
                {  
                    bb1[l4++]=Min2%10;  
                    Min2/=10;  
                }  
                for(i=0;i<l3;i++)  
                    for(j=0;j<l4;j++){  
                        sum1[i+j]+=aa1[i]*bb1[j];  
                        lp=i+j;  
                }  
                for(i=0;i<lp;i++)  
                {  
                    ll w=sum1[i];  
                    sum1[i]=w%10;  
                    sum1[i+1]+=w/10;  
                }  
                int flag=0;  
                if(lp>l) flag=1;  
                else  
                {  
                    for(i=0;i<25;i++)  
                    {  
                        if(sum[i]<sum1[i])  
                        {  
                            flag=1;  
                            break;  
                        }  
                    }  
                }  
                if(flag)  
                {  
                    for(;lp>=0;lp--) printf("%lld",sum1[lp]);  
                        printf("
    ");  
                }  
                else   
                {  
                    for(;l>=0;l--) printf("%lld",sum[l]);  
                        printf("
    ");  
                }  
                      
        }  
        return 0;  
    }  
    View Code
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    scrapy xpath 定位节点获取数据
    pandas 获取增量数据
    10秒解决80端口被占用
    VS code 自定义快捷键
    解决npm 的 shasum check failed for错误
    JSON.parse与eval的区别
    display:flex,用这个布局就像开挂了!!!
    几款前端IDE工具:Sublime、Atom、VSCode比较
    npm install -S -D -g 有什么区别
    Vue框架学习——使用nvm下载8.12.0以后版本没有npm文件的解决办法
  • 原文地址:https://www.cnblogs.com/h-hkai/p/7506386.html
Copyright © 2020-2023  润新知