2026年6月GESP真题及题解(C++五级):排排坐

题目描述
老师正在和小朋友们分糖果。
小朋友们先在自己的手上写一个数字,然后坐成一排。
老师分发糖果的规则是:每个小朋友获得自己以及左侧所有小朋友的手上数字之和个糖果。
现在小朋友们都已经在自己手上写上了数字。
请帮小朋友们安排合适的座位顺序,使得小朋友们分到的糖果总量最大,输出这个最大值。
输入格式
输入 2 2 2 行,
第一行为一个正整数 n n n,表示小朋友的个数;
第二行为 n n n 个正整数 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots, a_n a1,a2,⋯,an,表示小朋友们手上的数字,整数之间以空格分隔。
输出格式
输出一个整数,表示小朋友们可能分到的最大糖果总数量。
输入输出样例 1
输入 1
5
7 5 8 9 3
输出 1
111
说明/提示
样例解释
小朋友安排座位后从左向右每人手上数字依次是: 9 , 8 , 7 , 5 , 3 9, 8, 7, 5, 3 9,8,7,5,3。
这时可以得到最多的糖果: ( 9 ) + ( 9 + 8 ) + ( 9 + 8 + 7 ) + ( 9 + 8 + 7 + 5 ) + ( 9 + 8 + 7 + 5 + 3 ) = 111 (9) + (9 + 8) + (9 + 8 + 7) + (9 + 8 + 7 + 5) + (9 + 8 + 7 + 5 + 3) = 111 (9)+(9+8)+(9+8+7)+(9+8+7+5)+(9+8+7+5+3)=111。
数据范围
1 ≤ n ≤ 1000 1 \le n \le 1000 1≤n≤1000, 1 ≤ a i ≤ 1000 1 \le a_i \le 1000 1≤ai≤1000。
思路分析
-
问题转化
设有排列 p 1 , p 2 , ... , p n p_1, p_2, \dots, p_n p1,p2,...,pn,第 i 个小朋友得到的糖果数是前缀和 S i = ∑ j = 1 i p j S_i = \sum_{j=1}^{i} p_j Si=∑j=1ipj。
总糖果数为 ∑ i = 1 n S i = ∑ i = 1 n ( n − i + 1 ) ⋅ p i \sum_{i=1}^n S_i = \sum_{i=1}^n (n-i+1) \cdot p_i ∑i=1nSi=∑i=1n(n−i+1)⋅pi
也就是说,位置越靠左(i 越小),其数字被累加的次数越多(权重越大)。
-
排序不等式
为了最大化加权和,应当将较大的数字放在权重较大的位置,即按数字从大到小排列。
因此只需将原数组降序排序,然后计算 ∑ i = 1 n ( n − i + 1 ) ⋅ a i ′ \sum_{i=1}^n (n-i+1) \cdot a_i' ∑i=1n(n−i+1)⋅ai′,其中 a i ′ a_i' ai′ 是降序排列后的数字。
-
实现方式
可以直接累加前缀和:排序后从左到右维护当前前缀和
pre,每次将pre累加到答案ans中,最终ans即为最大值。
代码实现
cpp
#include <bits/stdc++.h>
using namespace std;
int n, a[1005]; // n:人数, a:数字数组
bool cmp(int a,int b){
return a>b;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n, cmp); // 降序排序
long long ans = 0, pre = 0; // ans:最终答案, pre:当前前缀和
for (int i = 0; i < n; i++) {
pre += a[i]; // 更新前缀和
ans += pre; // 将前缀和累加到答案中
}
cout << ans; // 输出最大总糖果数
return 0;
}
功能分析
- 输入处理 :读取人数 n 和 n 个数字,存入数组
a。 - 排序 :使用
sort配合cmp函数将数组按从大到小排列,保证最大的数字放在最左边(权重最大)。 - 计算答案 :
遍历排序后的数组,维护pre(当前位置及左侧所有数字之和),每遍历一个位置就将pre累加到ans中。
由于pre正好等于该位置小朋友获得的糖果数,累加所有pre即得到总糖果数,且因排序保证了最优。 - 输出 :输出
ans即为可能的最大值。
各种学习资料,助力大家一站式学习和提升!!!
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"########## 一站式掌握信奥赛知识! ##########";
cout<<"############# 冲刺信奥赛拿奖! #############";
cout<<"###### 课程购买后永久学习,不受限制! ######";
return 0;
}
【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}
