题解
2026-06-07 12:53:52
发布于:浙江
12阅读
0回复
0点赞
首发题解,庆祝一下
大家好,我是энтджей,今天是我2026年第十七次正式发题解!
能不能点个赞
首先简化题意:
- 其实挺像这道题的
- 先输入班级人数,在输入每位同学的发言积极度,以及不同人数学习小组的基础讨论积极度,然后分组。分好组后,班级的讨论积极度总和为每一组的讨论积极度之和,详细点来讲就是:
- 设第组的总人数为,发言积极度最大值为,最小值为,则第组的讨论积极度为()
然后就是写代码:
- 建立dp二维数组,:表示分成了组,分了个人
- 因为讨论积极度为,所以无论你怎么选,只要有人,以及和不变,讨论积极度就不会变,那么在不等于时,和的差值越大,讨论积极度就越大,其余的发言积极度要越靠中间值越好,留出两边的、,让它们的差值变。讲了这么多,其实我就是要说明在一开始,要将数组排序
- 前置条件处理好了,那么开始思考需要的动态转移方程:
- 根据分析,得出:
其中,表示这一组的人数自行理解
- 根据分析,得出:
最后输出(write):
- 输出的最大值,其中
完整代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 305;
int n;
int c[N], a[N];
int dp[N][N]; //dp[j][k]:表示分成了j组,分了k个人
void read() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> c[i];
}
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
}
void process() {
sort(c + 1, c + 1 + n);
for(int i = n; i >= 1; i--) {
for(int j = 1; j <= n; j++) {
for(int k = i; k <= n; k++) {
if(i == 1) {
dp[j][k] = max(dp[j][k], dp[j - 1][k - 1] + a[i]);
} else {
dp[j][k] = max(dp[j][k], dp[j - 1][k - i] + a[i] + (c[n - j + 1] - c[j]));
}
}
}
}
}
void write() {
int ans = 0;
for(int j = 1; j <= n; j++){
ans = max(ans,dp[j][n]);
}
cout << ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
read();
process();
write();
return 0;
}
🎉完结撒花🎉
怎么感觉这篇又长又短捏?
这里空空如也






有帮助,赞一个