正题
首先我们需要知道一个结论,只有最后叶子节点的值才会影响答案,而分的方式不会影响。
因为这个题相当于叶子节点的值两两乘求最大值。
仔细分析一下过程就可以发现这个东西(虽然我太菜了分析不出来
然后问题就变成了把一个数n分成k+1份,求两两相乘总和的最大值。
我们设第一份是以此类推,那么答案就是
。
把他们写出来就会发现答案是
我们要令答案最大就要使后面那一堆东西最小。
可以发现当的时候,那个东西是最小的。
因为当此时,不管你怎么调整,必定是把一个小数的1移到大数上,而平方在数越大时增长越快,所以必定使答案更大。
然后代码就是判断一下就好了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
int n,k;
int t;
long long ans=0;
int main(){
scanf("%d %d",&n,&k);k++;t=n/k;
ans+=(long long)(n%k)*(t+1)*(n-t-1);
ans+=(long long)(k-n%k)*t*(n-t);
printf("%lld\n",ans/2);
}
本文探讨了一种算法问题,即如何将一个数值n分割成k+1份,以求得这些分割数值两两相乘后的最大总和。通过分析得出,当分割数值尽可能平均分配时,总和达到最大。文章提供了详细的解析过程及C++实现代码。
4656

被折叠的 条评论
为什么被折叠?



