如果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;
}