AcWing 1239. 乘积最大【双指针】

  1. 链接

    AcWing 1239. 乘积最大

  2. 思路

    1. k==n

      所有的数字是全部都选。

    2. k

      k%2==0

      负数的个数是偶数个的话,负负得正,那么一定是非负数。

      负数的个数如果是奇数个的话,那么我们就只选偶数个绝对值最大的负数。

      k%2==1

      所有的数字如果都是负数,那么选出来的结果也一定都是负数。

      否则的话,则一定至少有 1个非负数, 那么我们将最大的数取出来, 此时要选的个数就是 k–, k-- 是偶数,那么就又转化为 k-- 是偶数的情况思考。

  3. 代码

    #include
    using namespace std;
    
    typedef long long ll ;
    const int maxn = 100010;
    const int mod = 1e9+9;
    ll a[maxn];
    int main(void)
    {
        int n,k ;
        cin >> n >> k;
        for(int i = 0 ; i < n ; i ++) cin >> a[i];
        sort(a,a + n);
        ll ans = 1 ; 
        int l = 0 , r = n - 1 ;
        int sign = 1 ;
        if(k&1){
            ans =  a[r]; 
            r -- ; 
            k -- ;
            if(ans < 0) 
                sign = -1;  
        }
        while(k){
            ll x = a[l] * a[l + 1];
    		ll y = a[r] * a[r - 1];
            if(x * sign > y * sign){
                ans = x % mod * ans % mod;                                   
                l += 2;                               
            }
            else {
                ans = y % mod * ans % mod; 
                r -= 2; 
            }
            k -= 2; 
        }
        cout<<ans<<endl;
        return 0;
    }
    
    

你可能感兴趣的:(双指针)