首发题解,庆祝一下
大家好,我是ЭНТДЖЕЙ,今天是我2026年第十七次正式发题解!
2026年发布的题解!
能不能点个赞
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
首先简化题意:
* 其实挺像这道题的
* 先输入班级人数nnn,在输入每位同学的发言积极度,以及不同人数学习小组的基础讨论积极度,然后分组。分好组后,班级的讨论积极度总和为每一组的讨论积极度之和,详细点来讲就是:
* 设第iii组的总人数为pip_ipi ,发言积极度最大值为maximax_imaxi ,最小值为minimin_imini ,则第iii组的讨论积极度为a[pi]+(maxi−mini)a[p_i]+(max_i-min_i)a[pi ]+(maxi −mini )(a[]见题目a[]见题目a[]见题目)
然后就是写代码:
* 建立dp二维数组,dp[j][k]dp[j][k]dp[j][k]:表示分成了jjj组,分了kkk个人
* 因为讨论积极度为a[pi]+(maxi−mini)a[p_i]+(max_i-min_i)a[pi ]+(maxi −mini ),所以无论你怎么选,只要有pip_ipi 人,以及maximax_imaxi 和minimin_imini 不变,讨论积极度就不会变,那么pip_ipi 在不等于111时,maximax_imaxi 和minimin_imini 的差值越大,讨论积极度就越大,其余的发言积极度要越靠中间值越好,留出两边的maximax_imaxi 、minimin_imini ,让它们的差值变。讲了这么多,其实我就是要说明在一开始,要将ccc数组排序
* 前置条件处理好了,那么开始思考dpdpdp需要的动态转移方程:
* 根据分析,得出:
{dp[j][k]=max(dp[j][k],dp[j−1][k−1]+a[i]),pi=1dp[j][k]=max(dp[j][k],dp[j−1][k−i]+a[i]+(c[n−j+1]−c[j])),pi≠1\begin{cases} dp[j][k] = max(dp[j][k], dp[j - 1][k - 1] + a[i]),p_i = 1\\ dp[j][k] = max(dp[j][k], dp[j - 1][k - i] + a[i] + (c[n - j + 1] - c[j])),p_i ≠1 \end{cases}
{dp[j][k]=max(dp[j][k],dp[j−1][k−1]+a[i]),pi =1dp[j][k]=max(dp[j][k],dp[j−1][k−i]+a[i]+(c[n−j+1]−c[j])),pi =1
自行理解
其中1<=i<=n1 <= i <= n1<=i<=n,iii表示这一组的人数
最后输出(WRITE):
* 输出{dp[n][k]}\{dp[n][k]\}{dp[n][k]}的最大值,其中1<=k<=n1 <= k <= n1<=k<=n
完整代码:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
🎉完结撒花🎉
怎么感觉这篇又长又短捏?