链接:https://ac.nowcoder.com/acm/contest/20960/1037
来源:牛客网
来源:牛客网
题目描述
你要买n件物品,其中有一些是凳子。
商场正在举行促销活动,如果购物车中有至少一个凳子,那么你可以半价购买这个购物车中最贵的一个物品。
你有m辆购物车,请最小化你的花费。
商场正在举行促销活动,如果购物车中有至少一个凳子,那么你可以半价购买这个购物车中最贵的一个物品。
你有m辆购物车,请最小化你的花费。
输入描述:
第一行一个整数t表示数据组数 (1 ≤ t ≤ 100)。 每组数据第一行两个整数n,m (1 ≤ n,m ≤ 1000),接下来n行每行两个整数ai,bi,分别表示第i件物品的价格以及它是否是凳子 (1 ≤ ai ≤ 105, 0 ≤ bi ≤ 1)。
输出描述:
每组数据输出一行一个实数表示最小花费,保留一位小数。
示例1
输入
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一道简单的贪心问题,贪心策略为取购物车和凳子数量的最小值为可以打折的商品数量。然后挑最大的打折就可以了。
AC代码:
#include <bits/stdc++.h> using namespace std; struct Node { double price; int is_stool; }; Node a[1005]; bool comp(Node n1, Node n2) { return n1.price>=n2.price; } int main() { int t; cin>>t; while (t--){ int n, m; int cnt = 0; cin>>n>>m; for (int i=0;i<n;i++) { cin>>a[i].price; cin>>a[i].is_stool; if (a[i].is_stool==1) cnt++; } int half_num = min(m, cnt); double ans = 0; sort(a, a+n, comp); for (int i=0;i<n;i++) { if (half_num-i>0) ans+=a[i].price/2; else ans += a[i].price; } printf("%.1lf\n",ans); } return 0; }