hdu 6298 Maximum Multiple(规律)

hdu6298 Maximum Multiple

题目传送门

题意:

给你一个整数n,从中找出可以被n整除的三个数x,y,z;

要求x+y+z=n,且x*y*z最大。

思路:

开始一看T到1e6,n也到1e6,就想到打表,可是打表就只输出最大值

没有把取的那三个数也数出来,纠结了许久。

正解就是设a=n/x,b=n/y,c=n/z;

则1/a+1/b+1/c=1;

则abc可取3,3,3;2,3,6;2,4,4

代码:

#include<bits/stdc++.h>
using namespace std;
#define N 100
typedef long long ll;
/*int main()
{
   int m;
   while(cin>>m)
   {

      for(int n=1;n<=m;n++){
        long long ans=-1;
        int a=0,b=0,c=0;
       for(int i=1;i<=n;i++)
       {
           for(int j=1;j<=n;j++)
           {
               for(int k=1;k<=n;k++)
               {
                   if(n%i==0&&n%j==0&&n%k==0&&i+j+k==n)
                   {
                       long long tmp=i*j*k;
                       if(ans<tmp)
                       {
                           ans=tmp;
                           a=i;
                           b=j;
                           c=k;
                       }
                   }
               }
           }
       }
       if(ans!=-1){
       cout<<n<<" "<<ans<<" ";
       cout<<a<<" "<<b<<" "<<c<<endl;
       }
     }
   }
    return 0;
}*/
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    ll n;
    cin>>T;
    while(T--){
        cin>>n;
        ll ans=-1;
        ll x,y,z;
        if(n%2==0) {
            x=n/2,y=n/3,z=n/6;
            if(x+y+z==n&&x*y*z>ans)
                ans=x*y*z;
            x=n/2,y=n/4,z=n/4;
            if(x+y+z==n&&x*y*z>ans)
                ans=x*y*z;
        }
        if(n%3==0){
            x=n/3,y=n/3,z=n/3;
            if(x+y+z==n&&x*y*z>ans)
                ans=x*y*z;
        }
        cout<<ans<<endl;
    }
}
View Code
原文地址:https://www.cnblogs.com/zhgyki/p/10330711.html