如果a<b,那么a/b=0。 交换数组元素的位置不影响结果,所以可以贪心的去做。

一个小的元素一定会带走一个适当大的元素,这样才是最优的,所以k次操作之后,数组在下标n-k之后的元素都是将会被消耗掉的,而消耗者就是n-k之前的元素,而且一定是在n-k之前的大元素来消耗,这样才会保证k次操作后剩余的值最小。

例如: 1 1 2 2 3 3 3 k=3 ,所以被消耗的数对就是(1,3),(2,3),(2,3),这样数组里就只剩下一个1,显然是最优的。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=105;
int a[M];
int main(){
	int t; cin>>t;
    while(t--){
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++) cin>>a[i];
        sort(a+1,a+1+n);
        int i=n-k; int j=n;
        int res=0;
        while(k--){
            res+=a[i--]/a[j--];
        }
        for(k=1;k<=i;k++){
            res+=a[k];
        }
        cout<<res<<endl;
    }
    return 0;
}