Shopping
Shopping
https://ac.nowcoder.com/acm/problem/19784
题目
要买 n 件物品,其中有一些是凳子。
商场正在举行促销活动,如果购物车中有至少一个凳子,那么可以半价购买这个购物车中最贵的一个物品。
现有 m 辆购物车,求最少的花费。
解题思路
将非凳子的价格录入 item1
,将凳子的价格录入 item2
。
对 item1
和 item2
进行从大到小排序。
如果还有新的购物车,将价格最贵的物品放入其中,
- 如果该物品是凳子,价格减半。
- 如果不是凳子,将价格最小的凳子放入其中,最贵的物品价格减半;如果没有凳子,物品原价。
如果没有新的购物车,将剩下的东西随便放置其中一个购物车,物品原价。
C++代码
#include<cstdio> #include<vector> #include<algorithm> using namespace std; int main(){ int t; scanf("%d", &t); int n, m; while(t--){ scanf("%d%d", &n, &m); vector<int> item1, item2; int a, b; for(int i=0; i<n; ++i){ scanf("%d%d", &a, &b); if(b==0) item1.push_back(a); else item2.push_back(a); } sort(item1.rbegin(), item1.rend()); sort(item2.rbegin(), item2.rend()); int k = 0; double sum = 0; for(int i=0; i<item2.size();){ if(m > 0){ if(k<item1.size() && item1[k]>item2[i]){ sum += item1[k]*0.5; sum += item2.back(); item2.pop_back(); ++k; } else{ sum += item2[i]*0.5; ++i; } --m; } else{ sum += item2[i]; ++i; } } for(; k<item1.size(); ++k) sum += item1[k]; printf("%.1f\n", sum); } return 0; }