b_lq_乘积最大(双指针+分类讨论)
从n个数中选出 K 个数,使其乘积最大(每个数都很大)
思路
- k为奇数时,一定先选最右边的那个数,因为无论为正或为负都对结果贡献最大
- k为偶数时,每次从两端选两个数,看哪个大
枯了,这题溢出搞了很久
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n,k; cin>>n>>k;
ll a[n]; for (int i=0; i<n; i++) cin>>a[i];
ll ans=1, mod=1000000009, sign=1;
if (k==n) {
for (ll x : a) ans=(ans*x)%mod;
} else {
sort(a, a+n);
int l=0, r=n-1;
if (k&1) {
ans=(ans*a[r--])%mod, k--;
if (ans<0) sign=-1;
}
while (k) {
ll lv=a[l]*a[l+1], rv=a[r]*a[r-1];
if (sign*lv>sign*rv) ans=lv%mod*ans%mod, l+=2; //注意乘的顺序,不然还是会溢出
else ans=rv%mod*ans%mod, r-=2;
k-=2;
}
}
cout<<ans%mod;
return 0;
}