A128409题解
2026-08-14 19:21:23
发布于:浙江
24阅读
0回复
0点赞
背景:
原题链接
现在的五级越来越水了,都简单成什么样了。2025年及以前的五级还是有点难度的。
思路:
获得自己以及左侧所有小朋友的手上数字之和个糖果,所以要让大的数放前面,将数组从大到小排序,然后遍历 ~ 遍历,再每次加 ~ 的糖果数,最后输出。
本题也可以用前缀和优化,时间复杂度,但由于,所以原代码时间复杂度,不会超时,不优化也可以。然而本题不知道是数据水还是什么,运行时间没什么区别。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
int a[1010];
int main(){
int n;
cin>>n;
for (int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n,greater<int>());//排序
int ans=0;
for (int i=1;i<=n;i++){
for (int j=i;j>=1;j--){
ans+=a[j];
}//获得自己以及左侧所有小朋友的手上数字之和个糖果
}
cout<<ans;//输出
return 0;
}
时间复杂度
前缀和优化代码:
#include <iostream>
#include <algorithm>
using namespace std;
int a[1010];
int p[1010];//前缀和数组
int main(){
int n;
cin>>n;
for (int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n,greater<int>());
for (int i=1;i<=n;i++){
p[i]=p[i-1]+a[i];//排序后前缀和
}
int ans=0;
for (int i=1;i<=n;i++){
ans+=p[i];//直接加a[i]及以前的糖果数和(前面前缀和数组统计好的)
}
cout<<ans;
return 0;
}
时间复杂度
结语:
希望对大家学习OI有帮助!
这里空空如也








有帮助,赞一个