Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
153033 lrf820215 最优分解 C++ 通过 100 0 MS 260 KB 1039 2024-06-28 23:14:54

Tests(10/10):


/*最优分解 贪心算法。如果a+b=n,则|a-b|越小,那么a*b越大,可以将n分解成从2开始的连续自然数的和。 例如:输入n=10,则可以分解为2、3、4,还剩下1不够5,把这个1倒着加,4 -> 5。 所以,最终分解为2,3,5,结果为2*3*5=30。 如果剩下的数字和前面的数字相等,则最后的再加1 */ #include <bits/stdc++.h> using namespace std; int a[100]; //保存分解后的数 long long Fun(int n){ int k=0; //k为数组下标指针 for(int i=2; n>a[k]; i++){ a[++k]=i; n-=i; } if(n==a[k]) //如果剩下值和最后一个数组元素值相等 a[k]++; //最后的数组元素值再加1 for(int i=0; i<n; i++) //再把剩下的值逆序每个加1到数组元素中 a[k-i]++; long long sum=1; for(int i=1; i<=k; i++) //从下标1开始乘 sum*=a[i]; return sum; } int main(){ int n; scanf("%d",&n); printf("%lld\n",Fun(n)); return 0; }


测评信息: