欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-17 20:04:04
...

杭电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,这样必须考虑到使用一些简便方法做题,如果方法过于复杂,或者有点复杂,即有可能超时。