https://www.nowcoder.com/acm/contest/203/D
尽量保证每个购物车都能有一个半价机会即可并且将这个半价尽量给较大的价格的物品
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
double a[maxn];
ll b[maxn];
int n,m;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int k1=0,k2=0;
int x,y;
for(int i=0;i<n;i++)
{
scanf("%lf%d",&a[i],&y);
if(y)k1++;
else k2++;
}
if(k1>=m)
{
double ans=0;
sort(a,a+n,cmp);
for(int i=0;i<m;i++)
{
ans+=a[i]/2.0;
}
for(int i=m;i<n;i++)
ans+=a[i];
printf("%.1lf\n",ans);
}
else
{
double ans=0;
sort(a,a+n,cmp);
for(int i=0;i<k1;i++)
{
ans+=a[i]/2.0;
}
for(int i=k1;i<n;i++)
ans+=a[i];
printf("%.1lf\n",ans);
}
}
return 0;
}