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;
}
posted @ 2020-10-07 16:09  童年の波鞋  阅读(203)  评论(0编辑  收藏  举报