第九届蓝桥杯省赛最后一题 乘积最大

第九届蓝桥杯省赛最后一题c++

分类讨论,正数(0归到正数集合),负数分别排序。k%2==0负数确定两两取和正数比较一下哪一个大,k%2==1,有正数先取一个正数,转换成k%2==0,不然取负数中最大的k个呗。spa

不知道能过多少数据,没测过。思路应该是对的。debug

蓝桥杯题目难度不必定按照顺序来额。全部题都看一遍,先写简单的,当时一直卡前面的题,后面的题看都没看,QAQ。code

题目都不是很难,除了那个摔手机的,自闭。blog

#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a))
#define huan printf("\n")
#define debug(a,b) cout<<a<<" "<<b<<" "<<endl
#define ffread(a) fastIO::read(a)
using namespace std; typedef long long ll; const int maxn = 6e3+10; const int inf = 0x3f3f3f3f; const ll mod = 1000000009; const double epx = 1e-6; const double pi = acos(-1.0); //head------------------------------------------------------------------
vector<ll> zheng,fu; int cmp(ll a,ll b) { return a>b; } int main() { int n,k; cin>>n>>k; for(int i=0;i<n;i++) { ll x; cin>>x; if(x>=0) zheng.pb(x); else if(x<0) fu.pb(x); } sort(all(fu)); sort(all(zheng),cmp); for(auto it:fu) cout<<it<<endl; for(auto it:zheng) cout<<it<<endl; ll ans; if(k==n) { ans=1; for(auto it:zheng) ans=ans*it%mod; for(auto it:fu) ans=ans*it%mod; } else if(k==1) { if(zheng.size()==0) ans=*(--fu.end()); else ans=*zheng.begin(); } else if(k%2==0) { int cnt1=0,cnt2=0; ans=1; while(k>0) { int temp1=-inf,temp2=-inf; if(cnt1+1<fu.size()) temp1=fu[cnt1]*fu[cnt1+1]%mod; if(cnt2+1<zheng.size()) temp2=zheng[cnt2]*zheng[cnt2+1]%mod; if(temp1>temp2) ans=ans*temp1%mod,cnt1+=2; else ans=ans*temp2%mod,cnt2+=2; k-=2; } } else { int cnt1=0,cnt2=0; if(zheng.size()>0) { ans=zheng[cnt2++]%mod; k--; while(k>0) { int temp1=-inf,temp2=-inf; if(cnt1+1<fu.size()) temp1=fu[cnt1]*fu[cnt1+1]%mod; if(cnt2+1<zheng.size()) temp2=zheng[cnt2]*zheng[cnt2+1]%mod; if(temp1>temp2) ans=ans*temp1%mod,cnt1+=2; else ans=ans*temp2%mod,cnt2+=2; k-=2; } } else { ans=1; cnt1=fu.size()-1; while(k--) { ans=ans*fu[cnt1--]%mod; } } } cout<<ans<<endl; }
相关文章
相关标签/搜索