题目大意:
从一个数组里面,每次取2个的和不大于k的值乘在一起,数组内1个数只能选一次,这样最多做m次,求乘积的和值的最大值。
思路:对于一个数,每次肯定取满足条件的最大的数和他乘,然后取前m 大
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
int arr[MAXN];
multiset<int>s;
multiset<int>::iterator it;
bool cmp(int a , int b)
{
return a > b;
}
int main()
{
int t;
scanf("%d" , &t);
while(t--)
{
int n , m , k;
scanf("%d %d %d" , &n , &m , &k);
s.clear();
int tmp;
for(int i = 0 ; i < n ; i ++)
{
scanf("%d" , &arr[i]);
s.insert(arr[i]);
}
long long ans = 0;
int cnt = 0;
while(s.size() >= 2)
{
it = s.end();
--it;
tmp = (*it);
s.erase(it);
it = s.upper_bound(k - tmp);
if(it == s.begin()) continue;
--it;
tmp = tmp * (*it);
arr[cnt++] = tmp;
s.erase(it);
}
sort(arr , arr + cnt , cmp);
for(int i = 0 ; i < cnt && i < m ; i ++)
{
ans += arr[i];
}
printf("%lld\n" , ans);
}
}