传送门:牛客
题目描述:
你要买n件物品,其中有一些是凳子。
商场正在举行促销活动,如果购物车中有至少一个凳子,那么你可以半价购买这个购物车中最贵的一个物品。
你有m辆购物车,请最小化你的花费。
输入:
2
5 1
1 0
2 1
3 1
4 0
5 0
5 10
1 0
2 1
3 1
4 0
5 0
输出:
12.5
10.5
主要思路:
是一道简单的模拟题,我们仔细阅读之后就会发现要比较购物车的数量和凳子的数量,因为当购物车的数量比凳子数量要多时,此时凳子肯定是每一个购物车都来一个才是最优的,反之当购物车的数量多余凳子的数量时,此时凳子多余的数量也将没有用,所以只要两者去较小值即可.然后根据贪心的思想,将最大的前(凳子数量)的物品的价值取一半即可,下面使用了结构体
的方法来实现
注意点:需要保留一位小数以及需要使用double
的类型来储存数据
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
ll x=0,w=1;char ch=getchar();
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*w;
}
#define maxn 1000000
struct Thing{
double mon;int shifou;
}thing[2000];
bool cmp(Thing a,Thing b) {
return a.mon>b.mon;
}
int main() {
int T;T=read();
while(T--) {
memset(thing,0,sizeof(thing));
int n, m;n=read();m=read();
int num=0;
for(int i=1;i<=n;i++) {
thing[i].mon=read();
thing[i].shifou=read();
if(thing[i].shifou==1) num++;
}
sort(thing+1,thing+n+1,cmp);
int shiji=min(m,num);
double ans=0;
for(int i=1;i<=n;i++) {
if(i<=shiji) {
ans+=(thing[i].mon/2);
}else {
ans+=thing[i].mon;
}
}
printf("%.1lf\n",ans);
}
return 0;
}