1 solutions

  • 0
    @ 2025-5-14 21:54:41

    最大化最小甜度问题适合用二分法求解。通过二分猜测最小甜度 midmid,然后验证是否存在至少 kk 种水果的甜度 mid≥ mid,且其中价格最小的 kk 种水果的总价格 B≤ B

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    #define endl '\n'
    const int N = 1e5 + 10; 
    struct Fruit { 
        int sweetness; 
        int price;     
    } fruits[N]; 
    
    int n, B, k; 
    bool cmp(Fruit a, Fruit b) { 
        return a.price < b.price; 
    }
    
    bool check(int mid) { 
        vector<Fruit> valid;
        for (int i = 1; i <= n; i++) { 
            if (fruits[i].sweetness >= mid) {
                valid.push_back(fruits[i]);
            }
        }
        int cnt = valid.size();
        if (cnt < k) return false;  
        sort(valid.begin(), valid.end(), cmp);
        int sum = 0;
        for (int i = 0; i < k; i++) { 
            sum += valid[i].price;
            if (sum > B) return false; 
        }
        return sum <= B; 
    }
    
    void solve() { 
        cin >> n >> B >> k;
        int min_sweet = INT_MAX, max_sweet = 0;
        for (int i = 1; i <= n; i++) { 
            cin >> fruits[i].sweetness >> fruits[i].price;
            min_sweet = min(min_sweet, fruits[i].sweetness); 
            max_sweet = max(max_sweet, fruits[i].sweetness); 
        }
        
        int left = min_sweet, right = max_sweet;
        int ans = -1; 
        
        while (left <= right) { 
            int mid = left + (right - left) / 2; 
            if (check(mid)) { 
                ans = mid; 
                left = mid + 1; 
            } else { 
                right = mid - 1; 
            }
        }
        
        cout << ans << endl; 
    }
    
    signed main() { 
        ios::sync_with_stdio(false);
        cin.tie(0), cout.tie(0);
        solve();
        return 0;
    }
    
    • 1

    Information

    ID
    1476
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    8
    Tags
    (None)
    # Submissions
    81
    Accepted
    15
    Uploaded By