学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
给定一个由n个整数组成的数列 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,…,an,请为这个数列找到一个平衡点,使得平衡点左侧与右侧的引力尽量接近。
若平衡点为k,则左侧引力定义为数列中下标小于k的各个元素到 a k a_k ak的距离乘以这些元素大小的总和。同理,右侧引力定义为数列中下标大于k的每个元素到 a k a_k ak的距离乘以这些元素大小的总和。
例如:n=6,若选择 a 3 a_3 a3为平衡点,左侧的引力计算公式为:
L = ( 3 − 1 ) × a 1 + ( 3 − 2 ) × a 2 L=(3-1)\times a_1+(3-2)\times a_2 L=(3−1)×a1+(3−2)×a2
右侧的引力计算公式为:
R = ( 4 − 3 ) × a 4 + ( 5 − 3 ) × a 5 + ( 6 − 3 ) × a 6 R=(4-3)\times a_4+(5-3)\times a_5+(6-3)\times a_6 R=(4−3)×a4+(5−3)×a5+(6−3)×a6
请你找到一个最佳平衡点k,并输出平衡点的位置和选择该点为平衡点时左右引力之差绝对值的最小值。
【输入】
第一行一个整数n;
第二行n个整数 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,…,an。
【输出】
一行一个整数,表示平衡点的左右引力之差绝对值的最小值。
【输入样例】
4
1 2 3 4
【输出样例】
0
【代码详解】
#include <bits/stdc++.h>
using namespace std;
long long n, a[300005], sum_f[300005], sum_b[300005], L[300005], R[300005], ans=9e18;
int main()
{
cin >> n;
for (int i=1; i<=n; i++) {
cin >> a[i];
}
for (int i=1; i<=n; i++) {
sum_f[i] = sum_f[i-1] + a[i];
}
for (int i=n; i>=1; i--) {
sum_b[i] = sum_b[i+1] + a[i];
}
for (int k=2; k<=n; k++) {
L[k] = L[k-1] + sum_f[k-1];
}
for (int k=n-1; k>=1; k--) {
R[k] = R[k+1] + sum_b[k+1];
}
for (int k=2; k<=n-1; k++) {
ans = min(ans, abs(L[k]-R[k]));
}
cout << ans << endl;
return 0;
}
【运行结果】
4
1 2 3 4
0