給 n 個整數,選 k 個使乘積最大;若乘積相同,使和最大。輸出該最大和。n≤10000。
按絕對值降序排序。前 k 個為候選集。根據負數個數奇偶、是否含 0、剩餘元素符號分類討論。
outPos * inNegMinAbs vs outNegMaxAbs * inPosMin)。#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10005;
int n,k,a[MAXN];
bool cmpAbs(int x,int y){ return abs(x)!=abs(y)?abs(x)>abs(y):x>y; }
int solve() {
sort(a,a+n,cmpAbs);
int sum=0, negCnt=0, minNeg=0, maxPos=0;
bool hasZero=false;
for(int i=0;i());
int s=0; for(int i=0;i0 && !outPos) outPos=a[i];
if(a[i]<0 && !outNeg) outNeg=a[i];
if(a[i]==0) hasOutZero=1;
}
if(maxPos==0) { // 候選集無正數
if(outPos) return sum - minNeg + outPos;
else { sort(a,a+n,greater()); int s=0; for(int i=0;i()); int s=0; for(int i=0;i= outNeg * minNeg) return sum - minNeg + outPos;
else return sum - maxPos + outNeg;
}
}
}
int main() {
while(cin>>n>>k && (n||k)) {
for(int i=0;i>a[i];
cout << solve() << endl;
}
return 0;
}