杭电2018暑假多校联赛第一场的第一题 Maximum Multiple

   题目的大概意思就是x,y,z是n的3个因子,可以重复。使n=x+y+z,并且xyz最大。如果这个最大值存在,就输出这个最大值,否则输出-1。n的范围是[1,1000000],测试组数T的范围是[1,1000000],显然T的范围有点大,如果方法使用不当,超时是必然的,刚开始我打了一个素数表,并且用C++的cin  cout输入输出,提交结果是超时了。后来慢慢发现可以不用打素数表,并且我把cin   cout改成了C语言的输入输出,最后还是过了。

可以发现,在这道题中,该数的因子不能是它本身。
当时我做这道题的时候,发现的规律是数可以分为4类,考虑一个数与因子1,2,3,4的关系:
1.除2,3外,只含有因子1的数,例如1,5,7;
2.含有因子2不含因子3和4的数,例如10,14;
3.含有因子3的数,例如3,6,9;
4.含有因子4不含因子3的数,例如4,8,16。

首先考虑一下1,2这两个数。
显然这两个数都不符合条件;

除了这三个数之外,通过多次测试得出规律:
由题看出,该数是由3个因子相加,这是很重要的一个细节。
符合条件1,2的数都不行。
符合条件3的数,将该数除以3,得到的那个数重复加三次即等于n,并且该数的三次方符合xyz最大。(并且要考虑到这个数的三次方可能会超出int范围,所有定义时候用long long定义)
符合条件4的数,将该数除以2,得到数a,除以4,得到数b,则n=a+b+b,并且a*b*b符合xyz最大。

下面给出我当时写的代码:

#include<stdio.h>
int main()
{
    int  T,n;
    long long b,c,d;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        if(n==1)           //考虑 1;
            printf("-1\n");
        else if(n==2)      //考虑 2;
            printf("-1\n");
        else if(n%3==0)    //考虑只含因子3的数;
        {
            b=n/3;
            printf("%lld\n",b*b*b);
        }
        else if(n%2==0)    //考虑不含因子3的数;
        {
            if(n%4==0)     //考虑含有因子4的数;
            {
                b=n/2;
                c=n/4;
                printf("%lld\n",b*c*c);

            }
            else          //考虑含有因子2不含因子4的数;
                printf("-1\n");
        }
        else if(n!=1||n!=2||n!=3||n%2!=0)      //考虑只含因子1的数;
            printf("-1\n");
    }
    return 0;
}

总结,当看到测试组数特别多,例如T的范围达到1000000,这样必须考虑到使用一些简便方法做题,如果方法过于复杂,或者有点复杂,即有可能超时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值