NC235687. 交替加乘
描述
有一个长度 的数组 ,可以对数组 进行任意排列。问:经过排列后,数组 进行"交替加乘”运算得到最大的结果是多少。
“交替加乘”运算规则: 和 相加,相加后结果乘以 ,相乘后结果再加上 ,相加后结果乘以 ,以此类推直到 。
数组 长度为 ,计算如:
数组 长度为 ,计算如:
求取模前的最大结果,输出对 取模。
输入描述
第一行包括一个整数 ,表示数组的长度。
第二行包括 个整数,分别表示 , 。
输出描述
输出一行,包含一个整数,表示 。
示例1
输入:
3 3 2 2
输出:
12
说明:
取得最大结果的数组 一种排列为 ,最大结果是 ,对 取模,输出 。Python3 解法, 执行用时: 190ms, 内存消耗: 16332K, 提交时间: 2022-04-22 21:07:40
n = int(input()) s = input().split() arr = [] mod = 10**9+7 for i in range(0,n): arr.append(int(s[i])) arr.sort() ret = arr[n//2] i = n//2-1 j = n//2+1 while i>=0 or j<n: if i >= 0: ret+=arr[i] ret%=mod if j < n: ret*=arr[j] ret%=mod i-=1 j+=1 print(ret)
C++(clang++ 11.0.1) 解法, 执行用时: 57ms, 内存消耗: 856K, 提交时间: 2022-10-14 21:20:34
#include<bits/stdc++.h> using namespace std; int main(){ int mod=(int)1e9+7; int a; cin>>a; int b[100008]; for(int i=0;i<a;i++){ cin>>b[i]; } sort(b,b+a); long long sum=b[a/2]; for(int i=a/2-1,j=a/2+1;i>=0;i--,j++){ sum+=b[i]; if(j<a) sum*=b[j]; sum%=mod; } cout<<sum<<endl; }