【C++题解】[广州大学附属中学-AKCSP2022信心联考]数组树

P a r t Part Part 1 1 1 读题

题目描述

w g y wgy wgy n n n个很不错的数,第 i i i个数是 a i a_i ai,他想用它们组一棵数树送给 a y b ayb ayb

a y b ayb ayb对一棵数树的喜爱程度是这棵数树的每个子树包含的数的和的总和。简单来说, a y b ayb ayb对一棵数树的喜爱程度是这样计算的: s u m 1 + s u m 2 + s u m 3 + … + s u m n sum_1+sum_2+sum_3+…+sum_n sum1+sum2+sum3++sumn,其中 s u m u sum_u sumu表示以 u u u为根的子树的数和。

为了令 a y b ayb ayb最开心, w g y wgy wgy想组出一棵他喜爱程度最高的数树。但是 w g y wgy wgy太笨了,你能帮助 w g y wgy wgy吗?

输入格式

第一行一个整数 n n n

接下来一行 n n n个整数,表示 w g y wgy wgy手里的数 a i a_i ai

输出格式

一行,一个整数表示最高的喜爱程度。

输入样例

2
1 2

输出样例

5

数据范围与提示

对于 20 % 20\% 20%的数据, n ≤ 100 n≤100 n100

对于 100 % 100\% 100%的数据, 1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105 1 ≤ a i ≤ 1 0 7 1≤a_i≤10^7 1ai107

P a r t Part Part 2 2 2 思路

本题看似很难,甚至可能都理解不了题意(例如题目中的“ s u m u sum_u sumu表示以 u u u为根的子树的数和”)。但是仔细想想,实际上就变得简单了许多。我们分析一下。

我们思考一下,在什么状态下,喜爱程度能达到最高。可能文字大家不能理解,我这里用几幅图来表示。
cmd-markdown-logo
可以发现,图一的喜爱程度为 1 + 2 + 3 = 6 1+2+3=6 1+2+3=6,图二的喜爱程度为 ( 1 + 2 + 3 ) + ( 2 + 3 ) + 3 = 14 (1+2+3)+(2+3)+3=14 (1+2+3)+(2+3)+3=14,图三的喜爱程度为 ( 3 + 2 + 1 ) + ( 2 + 1 ) + 1 = 10 (3+2+1)+(2+1)+1=10 (3+2+1)+(2+1)+1=10。很明显,图二的喜爱程度是最高的。同时,我们也可以推出喜爱程度的计算方法: s + = a [ i ] × a [ i ] s+=a[i]\times a[i] s+=a[i]×a[i](这里也可以写 i i i,此处 s s s代表喜爱程度总和)

由此,我们可以得出一个规律:在竖状且从小到大排序的情况下,喜爱程度是最高的。在输入后,我们需要先进行排序(冒泡排序、选择排序、 s o r t sort sort快速排序都可以),然后算出喜爱程度就可以了。也就是如下代码:

sort(a+1,a+1+n);//此处采用sort快排
for(int i=1;i<=n;i++)s+=i*a[i];//此处i、a[i]都可以用

然后我们再加上定义、输入和输出就可以啦!

小tip:大家可以先根据思路,写一下代码哦!

P a r t Part Part 3 3 3 代码

注意!!!我这里提供 s o r t sort sort快速排序,其他排序方法大家自行修改 s o r t sort sort部分

#include<bits/stdc++.h>
using namespace std;
unsigned long long n,a[100005],s;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	sort(a+1,a+1+n);//此处采用sort快排
	for(int i=1;i<=n;i++)s+=i*a[i];//此处i、a[i]都可以用
	cout<<s;
	return 0;
}

听完后,是不是觉得很简单呢?赶快自己去试一下吧!!!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值