zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    qt学习笔记(1):qt点击运行没有反应。
    JS Object类型
    JS Boolean数据类型和数据类型转换规律
    CSS雪碧图
    CSS
    PS基础
    JS number数字类型
    js中的变量和数据类型
    JS 基础
    单词
  • 原文地址:https://www.cnblogs.com/wdt1/p/13777731.html
Copyright © 2011-2022 走看看