分析
- 题意:给一个数组,通过若干次操作,对数组元素进行修改,使数组所有元素总和最大;操作要求是从数组任选两个数a[i],a[j],条件为x * y = a[i] * a[j],将x,y赋值给a[i],a[j];有一个贪心策略:当x=a[i] * a[j],y=1时,这样得到的数组其和能达到最大; 所以让数组第一个元素为所有数的乘积,后面所有元素为1,这样数组的总和达到最大;
- 比如一个序列:3 5 2 4,那么先取前两个数a[0]=3,a[1]=5,那么存在x=15,y=1满足x * y = a[0] * a[1],那么将数组更新为 15 1 2 4,然后取a[0]=15,a[2]=2,那么存在x=15,y=1满足x * y = a[0] * a[2],那么将数组更新为 30 1 1 4,同理最后数组变为:120 1 1 1,这样得到的总和为120 + n-1;
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100;
int a[N];
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
LL a1 = a[0];//序列的第一个元素
for (int i = 1; i < n; ++i) {
a1 = a1 * a[i];
}
//最终数组为:a1 1 1 1 1 ... 1
cout << (a1 + n - 1) * 2022 << endl;
}
return 0;
}