1. 程式人生 > >hdu 6298 Maximum Multiple(規律)

hdu 6298 Maximum Multiple(規律)

col long long aps 輸出最大值 space n) multipl syn urn

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

hdu 6298 Maximum Multiple(規律)