刷题记录:牛客NC19784Shopping

传送门:牛客
题目描述:

你要买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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值