AtCoder Beginner Contest 173E Multiplication 4(思维)

题意:给出长度为n的序列a,选出k个数字使得连乘积最大,输出取模mod。n<2e5,a[i]<1e9

题解:从小到大排序,k为奇数先取一个最大的,之后就是比较开头两个的乘积和结尾两个乘积的大小,注意当k为奇数的时候,且a全部为负数的时候分开讨论一下,还有就是需要先取模再乘积,会爆long long

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define fre freopen("C:\\in.txt", "r", stdin)
#define _for(i,a,b) for(int i=a; i< b; i++)
#define _rep(i,a,b) for(int i=a; i<=b; i++)
#define lowbit(a) ((a)&-(a))
#define inf 0x3f3f3f3f
#define endl "\n"
using namespace std;
typedef long long ll;
template <class T>
void read(T &x)
{
    char c; bool op=0;
    while(c=getchar(), c<'0'||c>'9') if(c=='-') op=1;
    x=c-'0';
    while(c=getchar(), c>='0'&&c<='9') x=x*10+c-'0';
    if(op) x=-x;
}

const int mod=1e9+7;

int main()
{
    int n, k;
    read(n), read(k);
    vector<ll> a(n);
    for(auto &val: a) read(val);
    sort(a.begin(), a.end());
    ll ans=1; int ok=0;
    if(k%2) ans*=a[--n], k--;
    if(ans<0) ok=1;
    int l=0, r=n-1;
    while(k){
        ll x=a[r]*a[r-1], y=a[l]*a[l+1];
        if(ok || x>y)
            ans=x%mod*ans%mod, r-=2; //注意每次取余,会溢出long long
        else ans=y%mod*ans%mod, l+=2;
        //cout<<l<<" "<<r<<" "<<ans<<endl;
        k-=2;
    }
    printf("%lld\n", (ans+mod)%mod);
    return 0;
}

 

posted @ 2020-08-08 10:06  N_Yokel  阅读(202)  评论(0编辑  收藏  举报