1 条题解
-
0
方法思路
- 我们需要在有限预算内买尽可能多的物品
- 贪心策略:优先购买价格低的物品,这样能买更多件
- 考虑折扣:支持优惠的物品实际价格为原价的95%
- 计算每个物品的实际价格,然后按价格从小到大排序
- 从最便宜的物品开始购买,直到预算用完
代码实现
Java
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] line = br.readLine().split(" "); int n = Integer.parseInt(line[0]); long k = Long.parseLong(line[1]); line = br.readLine().split(" "); int[] prices = new int[n]; for (int i = 0; i < n; i++) { prices[i] = Integer.parseInt(line[i]); } String discounts = br.readLine(); // 创建价格数组,不需要额外对象 long[] actualPrices = new long[n]; for (int i = 0; i < n; i++) { actualPrices[i] = discounts.charAt(i) == '1' ? prices[i] * 95L : prices[i] * 100L; } // 直接排序价格数组 Arrays.sort(actualPrices); int count = 0; long totalCost = 0; k *= 100; // 将k也乘以100 for (long price : actualPrices) { if (totalCost + price <= k) { totalCost += price; count++; } else { break; } } System.out.println(count); } }
Python
def max_items(n, k, prices, discounts): # 计算实际价格 actual_prices = [] for i in range(n): if discounts[i] == '1': # 支持优惠 actual_prices.append(prices[i] * 0.95) else: actual_prices.append(prices[i]) # 按实际价格排序 items = sorted([(actual_prices[i], i) for i in range(n)]) count = 0 total_cost = 0 for price, _ in items: if total_cost + price <= k: total_cost += price count += 1 else: break return count n, k = map(int, input().split()) prices = list(map(int, input().split())) discounts = input() print(max_items(n, k, prices, discounts))
C++
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n, k; cin >> n >> k; vector<int> prices(n); for (int i = 0; i < n; i++) { cin >> prices[i]; } string discounts; cin >> discounts; // 计算实际价格并排序 vector<double> actual_prices; for (int i = 0; i < n; i++) { double price = discounts[i] == '1' ? prices[i] * 0.95 : prices[i]; actual_prices.push_back(price); } sort(actual_prices.begin(), actual_prices.end()); int count = 0; double total_cost = 0; for (double price : actual_prices) { if (total_cost + price <= k) { total_cost += price; count++; } else { break; } } cout << count << endl; return 0; }
- 1
信息
- ID
- 64
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者