1 条题解

  • 0
    @ 2025-7-14 17:23:33

    方法思路

    1. 我们需要在有限预算内买尽可能多的物品
    2. 贪心策略:优先购买价格低的物品,这样能买更多件
    3. 考虑折扣:支持优惠的物品实际价格为原价的95%
    4. 计算每个物品的实际价格,然后按价格从小到大排序
    5. 从最便宜的物品开始购买,直到预算用完

    代码实现

    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
    上传者