Uva11059 最大乘积(改)---不连续子序列

    科技2025-11-03  9

    Uva11059 最大乘积(改)

    改:不连续子序列

    原题:输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0(表示无解)。 原题思路及解:https://www.cnblogs.com/patrolli/p/11370253.html

    这里改用不连续子序列的最大乘积,如 输入:5 2 -3 2 2 1 不连续子序列答案为:8 连续子序列答案为:4

    代码如下:

    #include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=20; vector<ll> nums; //存放正数 vector<ll> _nums; //存放负数 bool cmp(ll a ,ll b){ return a>b?a:b; } int main(){ int n,temp; cin>>n; for(int i=0;i<n;i++){ cin>>temp; if(temp>0){ nums.push_back(temp); } else if(temp<0){ _nums.push_back(temp); } else{ continue; } } ll result=1; if(_nums.size()%2!=0) { sort(_nums.begin(),_nums.end(),cmp); //奇数个负数,降序排列,去掉最小的负数 for(int i=0;i<_nums.size()-1;i++){ result*=_nums[i]; } } else{ for(int i=0;i<_nums.size();i++){ //偶数个负数,直接乘 result*=_nums[i]; } } for(int i=0;i<nums.size();i++){ result*=nums[i]; //正数相乘 } if(nums.size()==0&&_nums.size()==1) cout<<0<<endl; //只有一个负数,最大乘积为0 else cout<<result<<endl; return 0; }
    Processed: 0.011, SQL: 8