A. Joey Takes Money——贪心

文章描述了一种贪心策略来最大化数组所有元素的总和,通过选取数组中的两个数进行特定操作,使得数组变为一个数为所有数的乘积,其余数为1,从而达到最大总和。提供的C++代码示例展示了这一过程。

在这里插入图片描述
在这里插入图片描述

分析

  1. 题意:给一个数组,通过若干次操作,对数组元素进行修改,使数组所有元素总和最大;操作要求是从数组任选两个数a[i],a[j],条件为x * y = a[i] * a[j],将x,y赋值给a[i],a[j];有一个贪心策略:当x=a[i] * a[j],y=1时,这样得到的数组其和能达到最大; 所以让数组第一个元素为所有数的乘积,后面所有元素为1,这样数组的总和达到最大;
  2. 比如一个序列: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向上的yyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值