[蓝桥杯 2020 省 A1] 超级胶水
题目描述
小明有 颗石子,按顺序摆成一排,他准备用胶水将这些石子粘在一起。
每颗石子有自己的重量,如果将两颗石子粘在一起,将合并成一颗新的石子,重量是这两颗石子的重量之和。
为了保证石子粘贴牢固,粘贴两颗石子所需要的胶水与两颗石子的重量乘积成正比,本题不考虑物理单位,认为所需要的胶水在数值上等于两颗石子重量的乘积。
每次合并,小明只能合并位置相邻的两颗石子,并将合并出的新石子放在原来的位置。
现在,小明想用最少的胶水将所有石子粘在一起,请帮助小明计算最少需要多少胶水。
输入格式
输入的第一行包含一个整数 ,表示初始时的石子数量。
第二行包含 个整数 依次表示每颗石子的重量。
输出格式
输出一行包含一个整数,表示最少需要的胶水数。
样例 #1
样例输入 #1
3
3 4 5
样例输出 #1
47
样例 #2
样例输入 #2
8
1 5 2 6 3 7 4 8
样例输出 #2
546
提示
对于 的评测用例,。
对于 的评测用例,。
对于 的评测用例,。
对于所有评测用例,,。
蓝桥杯 2020 第一轮省赛 A 组 I 题。
思路
按 a, b, c, d 顺序粘合:
按 d, c, b, a 顺序粘合:
易知改变石子粘合顺序,总胶水量不变。
首先,定义一些常量和全局变量,包括一个整数n表示石子的数量,两个长整型变量sum和ans分别用于存储当前石子的总重量和需要的胶水量。然后,从输入中读取石子的数量n。
在一个while循环中,每次读取一个石子的重量t,然后将当前总重量sum乘以新的石子重量t,累加到需要的胶水量ans中,最后将新的石子重量t累加到总重量sum中。这个过程实际上是模拟了每次将新的石子粘到已经粘在一起的石子上,需要的胶水量是新石子的重量和已经粘在一起的石子的总重量的乘积。
最后,输出需要的胶水量ans。
AC代码
#include <algorithm>
#include <iostream>
#define mp make_pair
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;
const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
int n;
ll sum = 0;
ll ans = 0;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
while (n--) {
int t;
cin >> t;
ans += sum * t;
sum += t;
}
cout << ans;
return 0;
}