题目描述:
给定 n 个整数 a1,a2,…,an。
请你从中选取最多不超过 m 个数(也可以什么都不选)。
选取正数将会扣除相应值的分数,选取负数将会得到相应值的绝对值的分数,选取 0 不得分也不扣分。
请计算可以获得的最大分数。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含两个整数 n,m。
第二行包含 n 个整数 a1,a2,…,an。
输出格式
每组数据输出一行结果,表示最大分数。
数据范围
1≤T≤20, 1≤m≤n≤100, −1000≤ai≤1000
输入样例:
5
5 3
-6 0 35 -2 4
4 2
7 0 0 -7
6 6
756 -611 251 -66 572 -818
5 5
976 437 937 788 518
5 3
-2 -2 -2 -2 -2
输出样例:
8
7
1495
0
6
思路:
选取正数会扣分,选取负数会加分,那么只需要加上所有的负数的绝对值,即减去所有的负数即可。
因为选取的数最多不能超过m个,所以直接从小到大对数组进行排序,选取前m个数进行计算,0不影响计算结果。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int a[N];
int main()
{
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n); //排序数组
int res = 0;
for(int i=0;i<m;i++) {
if(a[i] <= 0) res -= a[i]; //加上负数的绝对值
}
cout<<res<<'\n';
}
return 0;
}